问题
我想将一串路径(每个路径可能包含转义空格)转换为打印的路径列表 . 我主要使用 echo
和 sed
,问题在于其中(见下文) .
例如,我想要这三个文件:
one two three\ two\ one
要打印在三行上:
one
two
three two one
“sed”和“echo”的问题
(1)这三个样本文件:“一个”,“两个”和“三个二一” .
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
分开(使用-print0
)或使用find -exec
. 试图将它们格式化为shell单词不是要走的路 .echo
没有显示您期望的值的原因是因为$'\n'
是Bash语法,意思是文字换行 . 它不是echo
语法,并且echo
不参与解释它 .对于
dash
,xargs
和其他更传统的工具,$'\n'
只是格式化文字字符dollar-backslash-n($\n
)的一种奇怪方式 .由于您使用的是
xargs echo
,因此不涉及bash
,因此您将获得$\n
. 解决方案不是尝试将数据格式化为代码,以便代码将评估回原始数据 . 解决方案是完全跳过该步骤,只让数据成为数据,例如在最初的示例中 .这个命令对我有用:
诀窍是
用
\n
替换\\n
在xargs参数中使用
-L1
我使用
{}
和-I{}
只是为了证明为每一行调用了回声不是解决方案,而是对你在自己的帖子“为什么xargs echo”无效的评论的答案,请参阅这个答案,关于$'\ n'是什么:
https://stackoverflow.com/a/4128305/4092051