Замените разделитель строк sed на NUL, чтобы он выполнял роль префильтра xargs -0 - PullRequest
10 голосов
/ 21 сентября 2010

Я запускаю командную строку следующим образом:

filename_listing_command | xargs -0 action_command

Где filename_listing_command использует нулевые байты для разделения файлов - это то, что xargs -0 хочет использовать.

Проблема в том, что я хочу отфильтровать некоторые файлы.Примерно так:

filename_listing_command | sed -e '/\.py/!d' | xargs ac

но мне нужно использовать xargs -0.

Как изменить разделитель строк, который хочет sed, с новой строки на NUL?

Ответы [ 4 ]

13 голосов
/ 16 апреля 2014

Если вы нажали этот SO в поисках ответа и используете GNU sed 4.2.2 или новее, теперь у него есть опция -z, которая выполняет то, что запрашивает OP.

5 голосов
/ 21 сентября 2010

Пропустить через grep:

filename_listing_command | grep -vzZ '\.py$' | filename_listing_command

-z принимает нулевые терминаторы на входе, а -Z создает нулевые терминаторы на выходе, а -v инвертирует совпадение (исключая).

Редактировать:

Попробуйте, если вы предпочитаете использовать sed:

filename_listing_command | sed 's/[^\x0]*\.py\x0//g' | filename_listing_command
1 голос
/ 25 сентября 2010

Если ни одно из ваших имен файлов не содержит символ новой строки, тогда может быть проще прочитать решение, используя GNU Parallel:

filename_listing_command | grep -v '\.py$' | parallel ac

Узнайте больше о GNU Parallel http://www.youtube.com/watch?v=OpaiGYxkSuQ

0 голосов
/ 21 сентября 2018

С помощью Тома Хейла и , что ответа у нас есть: sed -nzE "s/^$PREFIX(.*)/\1/p"

...