【问题标题】:How does xargs format the input of $'\n'?xargs 如何格式化 $'\n' 的输入?
【发布时间】:2018-11-13 06:33:48
【问题描述】:

问题

(1) 给定一个字符串,我使用sed 将空格替换为$'\n'

echo "one two" | sed 's/ /$'"'"'\\n'"'"'/g'

这个输出:

# one$'\n'two

(2) 请注意,回显 (1) 的输出:

echo one$'\n'two

结果:

# one
# two

(3) 我以另一种方式回显 (1) 的输出,将 (1) 的输出通过管道传输到 xargs echo:

echo "one two" | sed 's/ /$'"'"'\\n'"'"'/g' | xargs echo

但我没有得到与 (2) 相同的输出:

# one$\ntwo

问题

格式化包含$'\n'的字符串的输入时xargs会做什么?

为什么回显带有$'\n' 的字符串与在同一字符串上使用xargs echo 不同?

【问题讨论】:

    标签: bash pipe echo newline xargs


    【解决方案1】:

    当你写作时

    echo one$'\n'two
    

    在命令行中,bash 将“$'\n'”替换为换行符。但是当你将它传递给xargs 时,就不会发生这样的替换。

    但是通过管道将它传递给xargs仍然不会做你想做的事,因为默认情况下xargs 使用换行符作为参数分隔符:

    $ echo "one two" | tr ' ' '\n' | xargs echo
    one two
    

    您必须告诉xargs 使用不同的分隔符,即使它是伪造的:

    $ echo "one two" | tr ' ' '\n' | xargs -0 echo
    one
    two
    

    【讨论】:

      【解决方案2】:

      不确定是否回答了您的问题,但我过去在类似情况下使用的一个技巧是改用printf,它在循环中循环传递的参数(如果% 不足以消耗它们),例如:

      $ printf "%s\n" one two
      one
      two
      

      如果上面是单个字符串,则使用 shell 自己的空格分隔符

      $ args="one two"
      $ printf "%s\n" $args
      one
      two
      

      为了完整起见,请使用一些 foo scriptlet 向xargs -n1 提供信息

      $ printf "%s\n" one two |xargs -n1 sh -c 'echo [$(date -R)] foo=$1' --
      [Sun, 03 Jun 2018 21:34:17 -0300] foo=one
      [Sun, 03 Jun 2018 21:34:17 -0300] foo=two
      

      【讨论】:

        猜你喜欢
        • 2020-10-01
        • 1970-01-01
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 2015-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多