如何正确地从sed管道$'\ n'到xargs回声?

时间:2018-06-01 21:17:15

标签: bash sed pipe echo newline

问题

我想将一串路径(每个路径可能包含转义空格)转换为打印的路径列表。我主要使用echosed,问题在于其中(见下文)。

例如,我想要这三个文件:

one two three\ two\ one

要打印在三行上:

one
two
three two one

“sed”和“echo”的问题

(1)这是三个样本文件:“one”,“two”和“three two one”。

echo "one two three\ two\ one"

# one two three\ two\ one

(2)我用换行符替换用文件分隔文件的空格。

echo "one two three\ two\ one" | sed 's/\([^\]\) /\1$'"'"'\\n'"'"'/g'

# one$'\n'two$'\n'three\ two\ one

(3)我测试的确是“回应”上述结果的输出我想要的输出。

echo one$'\n'two$'\n'three\ two\ one

# one
# two
# three two one

结合(2)和(3),功能打破使用“xargs echo”:

echo "one two three\ two\ one" | sed 's/\([^\]\) /\1$'"'"'\\n'"'"'/g' | xargs echo

# one$\ntwo$\nthree two one

如何修复sed替换?

如何修复sed替换,以便回显输出:

one
two
three two one

我正在寻找主要使用“echo”和“sed”的解决方案(不寻找其他解决方案)。

我也不能用“echo -e”来解释转义字符。

3 个答案:

答案 0 :(得分:1)

以下是您在屏幕上以换行符分隔显示文件名的方式:

find "$PWD" -maxdepth 1 -print

如果您想以某种方式处理它们,则应将它们\0分开(使用-print0)或使用find -exec。试图将它们格式化为shell单词不是一种方法。

echo未显示您期望的值的原因是因为$'\n'是Bash语法,意味着文字换行。 不是 echo语法,echo不参与解释。

对于dashxargs和其他更传统的工具,$'\n'只是格式化文字字符dollar-backslash-n($\n)的一种奇怪方式。

由于您使用的是xargs echo,因此不会涉及bash,因此您会获得$\n。解决方案不是尝试将数据格式化为代码,以便代码将评估回原始数据。解决方案是完全跳过该步骤,只让数据成为数据,例如在最初的示例中。

答案 1 :(得分:0)

这个命令对我有用:

echo "one two three\ two\ one" | sed 's/\([^\]\) /\1\n/g' | sed 's/\\ / /g' | xargs -L1 -I {} echo -{}-

诀窍是

  • \\n替换为\n
  • 在xargs参数中使用-L1
  • 我使用{}-I{}只是为了证明为每一行调用了回声

答案 2 :(得分:0)

不是解决方案,而是对您在自己的帖子上发表的评论的回答"为什么xargs回应"没有工作,看到这个答案有关$' \ n'是:

https://stackoverflow.com/a/4128305/4092051