为什么替换事物的顺序在sed中很重要?

时间:2016-05-20 18:28:40

标签: regex bash macos sed

我有一个这样的文件:

(paren)
[sharp]

我试着像这样替换:

sed "s/(/[/g" some_file.txt 

它运作得很好:

[paren)
[sharp]

然后我尝试像这样替换:

sed "s/[/(/g" some_file.txt 

它给了我错误:

sed: 1: "s/[/(/g": unbalanced brackets ([])

我找不到任何证据证明为什么会出错。为什么[(的顺序很重要?

非常感谢你。

3 个答案:

答案 0 :(得分:4)

[bracket expression的一部分,必须有结束副本(])。

转发[以匹配文字[符号:

echo "[sharp]" | sed 's/\[/(/g'

请参阅IDEONE demo

答案 1 :(得分:2)

重要的原因是因为你正在用文字字符串替换正则表达式。 因此,在第二个斜杠之后使用时,括号被视为字符。在第一个和第二个斜杠之间使用时,它被视为无效正则表达式的一部分。

所以在这个表达式中'''被视为一个字符:

s/[/(/g

在这个表达式中,它不是:

QSettings

答案 2 :(得分:1)

使用sed替换的第一个参数必须是正则表达式:
s/regex_pattern/replacement_string/

开头方括号在正则表达式模式中具有特殊含义,因为它是字符类的开头,例如[a-z]。这就是为什么您获得与替换顺序无关的错误消息:unbalanced brackets ([]) (必须关闭打开的字符类。)

要获得文字开口方括号,您需要将其转义:\[

sed 's/\[/(/' file

如果你的目标是将字符翻译成其他字符,那么使用翻译有一种更简单的方法可以避免循环替换的问题:

a='(paren)
[sharp]'

使用tr

echo "$a" | tr '[]()' '()[]'

sed

echo "$a" | sed 'y/[]()/()[]/'