【问题标题】:Change sed line separator to NUL to act as "xargs -0" prefilter?将 sed 行分隔符更改为 NUL 以充当“xargs -0”预过滤器?
【发布时间】:2011-04-14 22:58:35
【问题描述】:

我正在运行这样的命令行:

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?

【问题讨论】:

    标签: sed xargs


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      通过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
      

      【讨论】:

      • 您的sed 解决方案仍然会在\n 上中断,因此如果文件名包含\n 并以.py 结尾,则只会删除\n 之后的部分。例如,printf '%s\0' $'abc\ndef.py' | sed 's/[^\x0]*\.py\x0//g' 将打印 abc\n。这违背了使用空终止符的目的。
      • 在我的例子中,我的命令(用于\n 终结符)是sed -ne 's/^UU //p',我无法轻松将其转换为grep 命令。
      • @musiphil:试试看:grep -PzZo '^(?<=UU ).*'
      • @DennisWilliamson:谢谢,但它不起作用。你可以试试这个测试用例:printf '%s\0' 'UU abc.py' | cmd 和你的grep 作为cmd,abc.py\0 是预期的,但grep 什么也不打印(并且退出状态为 1)。
      • @musiphil:对不起,把克拉放在后面:grep -PzZo '(?<=^UU ).*'。不幸的是,-o 会导致添加换行符。没有它,输出将以空值结尾,但不会删除“UU”。我认为应该添加一个功能,以便-z 结合-o 输出空值。
      【解决方案3】:

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

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

      了解更多关于 GNU Parallel http://www.youtube.com/watch?v=OpaiGYxkSuQ

      【讨论】:

        【解决方案4】:

        在Tom Hale 和that 的帮助下,我们得到了: sed -nzE "s/^$PREFIX(.*)/\1/p"

        【讨论】:

          猜你喜欢
          • 2021-08-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-10
          • 2013-10-09
          • 1970-01-01
          相关资源
          最近更新 更多