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