首页 文章

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

提问于
浏览
2

问题

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

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

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 回答

  • 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 . 解决方案不是尝试将数据格式化为代码,以便代码将评估回原始数据 . 解决方案是完全跳过该步骤,只让数据成为数据,例如在最初的示例中 .

  • 0

    这个命令对我有用:

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

    诀窍是

    • \n 替换 \\n

    • 在xargs参数中使用 -L1

    • 我使用 {}-I{} 只是为了证明为每一行调用了回声

  • 0

    不是解决方案,而是对你在自己的帖子“为什么xargs echo”无效的评论的答案,请参阅这个答案,关于$'\ n'是什么:

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

相关问题