我想将一串路径(每个路径可能包含转义空格)转换为打印的路径列表。我主要使用echo
和sed
,问题在于其中(见下文)。
例如,我想要这三个文件:
one two three\ two\ one
要打印在三行上:
one
two
three two one
(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替换,以便回显输出:
one
two
three two one
我正在寻找主要使用“echo”和“sed”的解决方案(不寻找其他解决方案)。
我也不能用“echo -e”来解释转义字符。
答案 0 :(得分:1)
以下是您在屏幕上以换行符分隔显示文件名的方式:
find "$PWD" -maxdepth 1 -print
如果您想以某种方式处理它们,则应将它们\0
分开(使用-print0
)或使用find -exec
。试图将它们格式化为shell单词不是一种方法。
echo
未显示您期望的值的原因是因为$'\n'
是Bash语法,意味着文字换行。 不是 echo
语法,echo
不参与解释。
对于dash
,xargs
和其他更传统的工具,$'\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
-L1
{}
和-I{}
只是为了证明为每一行调用了回声答案 2 :(得分:0)
不是解决方案,而是对您在自己的帖子上发表的评论的回答"为什么xargs回应"没有工作,看到这个答案有关$' \ n'是: