在sed中以括号表达式开始和结束转义行

时间:2018-01-05 17:16:14

标签: sed

如何在sed中的括号表达式中转义行开头和行结束?

例如,假设我想用管道替换每行中的逗号,行开头和行尾:

echo "a,b,c" | sed 's/,/|/g'
# a|b|c
echo "a,b,c" | sed 's/^/|/g'
# |a,b,c
echo "a,b,c" | sed 's/$/|/g'
# a,b,c|
echo "a,b,c" | sed 's/[,^$]/|/g'
# a|b|c

我希望最后一个命令产生|a|b|c|。我还尝试通过反斜杠转义行开头和行结束,没有任何变化。

2 个答案:

答案 0 :(得分:3)

对于带有扩展正则表达式的GNU sed,您可以执行以下操作:

$ echo "a,b,c" | /opt/gnu/bin/sed -E 's/^|,|$/|/g'
|a|b|c|
$

-E选项启用扩展正则表达式,-r也是如此,但其他-E变体也使用sed用于同一目的,与{{1}不同}}

然而,由于我无法理解的原因,-r的BSD(macOS)变体产生:

sed

我想不出为什么。

如果这种可变性是不可接受的,请使用三替代解决方案:

$ echo "a,b,c" | sed -E 's/^|,|$/|/g'
|a|b|c
$

应该适用于$ echo "a,b,c" | sed -e "s/^/|/" -e "s/$/|/" -e "s/,/|/g" |a|b|c| $ 的任何变体。但请注意,sed生成echo "" | sed …3 subs…||变体生成-E。我不确定是否有一个简单的解决办法。

你试过这个,但它没有做你想要的事情:

|

这是应该预料到的。在角色类中,大多数特殊角色都失去了特殊性。关于$ echo "a,b,c" | sed 's/[,^$]/|/g' a|b|c $ (或$,但它不是一个元字符)在字符类中没有什么特别之处; ,仅在类的开头是特殊的,它否定了字符类。这意味着下面的内容显示了角色类内容的这种排列的正确预期行为:

^

它将所有非逗号,非美元字符映射到管道。我应该在回声周围使用单引号;那么反斜杠就没有必要了。我悄悄地跟着问题的代码。

答案 1 :(得分:1)

关注sed可能对您有帮助。

echo "a,b,c" | sed 's/^/|/;s/,/|/g;s/$/|/'

输出如下。

|a|b|c|