Linux 具有可变结尾的Sed正则表达式匹配不匹配
我有一个文件,在一个简单的例子中如下所示:Linux 具有可变结尾的Sed正则表达式匹配不匹配,linux,sed,Linux,Sed,我有一个文件,在一个简单的例子中如下所示: some_file_name{ something otherthing2 otherthing3 } “some_file_name”如何以行尾、空格或{结尾,因此我需要匹配每个变量。为了进一步复杂化some_file_name包含的内容/so分隔符需要不同…最后我需要在some_file_name{和下一个}之间替换“something”,因此结果将是: some_file_name{ something_replaced otherthing2
some_file_name{
something
otherthing2
otherthing3
}
“some_file_name”如何以行尾、空格或{结尾,因此我需要匹配每个变量。为了进一步复杂化some_file_name包含的内容/so分隔符需要不同…最后我需要在some_file_name{和下一个}之间替换“something”,因此结果将是:
some_file_name{
something_replaced
otherthing2
otherthing3
}
我已经做到了:
sed -r "\%some_file_name\($\|[[:space:]]\|\{\)%,\%\}%{s/something/something_replaced/}" "file.txt"
(sed-r是强制性的)
我最好的朋友问题就在这里:\($\\\[:space:]\\\\\{\)
我试图匹配3个可能的结局…但对于我的一生,我无法找出它缺少了什么
sed --version
sed (GNU sed) 4.2.2
-r
(和-E
,它更便于移植,因此只要有可能,就选择这一个)启用扩展正则表达式。因此,您既不应转义分组括号,也不应转义垂直条,否则它们将被sed逐字处理
还是困惑?考虑一下:
$ echo '(' | sed 's/(/X/'
X
$ echo '(' | sed -E 's/(/X/'
sed: -e expression #1, char 6: Unmatched ( or \(
$ echo '(' | sed -E 's/\(/X/'
X
我提到了-r是强制性的,我让它与-E一起工作,因为这更简单,正如你提到的,无需转义,但我必须与-r一起工作:(@VladoPortos正如我所说,它们是等效的,因此如果它与
-E
一起工作,应该与-r
一起工作。但是由于您需要它,我保留了-r
-r
只是在OSX/BSD aed和更新版本的GNU sed上工作的-E
的旧GNU sed的唯一等效物。
$ echo '(' | sed 's/(/X/'
X
$ echo '(' | sed -E 's/(/X/'
sed: -e expression #1, char 6: Unmatched ( or \(
$ echo '(' | sed -E 's/\(/X/'
X