如何在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|
。我还尝试通过反斜杠转义行开头和行结束,没有任何变化。
答案 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|