将sed行分隔符更改为NUL,以充当;xargs-0“;预过滤器?

将sed行分隔符更改为NUL,以充当;xargs-0“;预过滤器?,sed,xargs,Sed,Xargs,我运行的命令行如下: filename_listing_command | xargs -0 action_command filename_listing_command | sed -e '/\.py/!d' | xargs ac 其中,filename\u listing\u命令使用空字节分隔文件——这就是xargs-0想要使用的内容 问题是我想过滤掉一些文件。大概是这样的: filename_listing_command | xargs -0 action_command fil

我运行的命令行如下:

filename_listing_command | xargs -0 action_command
filename_listing_command | sed -e '/\.py/!d' | xargs ac
其中,
filename\u listing\u命令
使用空字节分隔文件——这就是
xargs-0
想要使用的内容

问题是我想过滤掉一些文件。大概是这样的:

filename_listing_command | xargs -0 action_command
filename_listing_command | sed -e '/\.py/!d' | xargs ac
但是我需要使用
xargs-0


如何将sed想要的行分隔符从换行符更改为NUL?

通过管道将其传输到
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

如果您的文件名中没有包含换行符,那么使用GNU Parallel阅读解决方案可能会更容易:

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

了解有关GNU Parallel的更多信息

如果您点击此按钮以寻找答案,并且正在使用GNU sed 4.2.2或更高版本,它现在有一个-z选项,可以满足OP的要求。

在和的帮助下,我们有:

sed-nzE“s/^$前缀(.*)/\1/p”

您的
sed
解决方案仍然会在
\n
上中断,因此如果文件名包含
\n
并以
.py
结尾,则只有
\n
之后的部分将被删除。例如,
printf'%s\0'$'abc\ndef.py'| sed's/[^\x0]*\.py\x0//g'
将打印
abc\n
。这违背了使用空终止符的目的。在我的情况下,我的命令(用于
\n
终止符)是
sed-ne的/^UU//p'
,我无法轻松地将其转换为
grep
命令。@musiphil:Try:
grep-PzZo'^(?@DennisWilliamson:谢谢,但它不起作用。您可以尝试以下测试用例:
printf“%s\0”UU abc.py'| cmd
,将您的
grep
设置为
cmd
,并且
abc.py\0
应为
grep
不打印任何内容(并保留退出状态1)@musiphil:对不起,把克拉放在后面看:
grep-PzZo'(?