首页 > 解决方案 > 带有可变结尾的 Sed 正则表达式匹配不匹配

问题描述

我的文件在简单示例中如下所示:

some_file_name{
something
otherthing2
otherthing3
}

“some_file_name”如何以行尾、空格或 { 结尾,所以我需要匹配每个变体。更复杂的事情 some_file_name 包含 / 所以分隔符需要不同......最后我需要替换 some_file_name{ 和下一个 } 之间的“某事”,所以结果将是:

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

标签: linuxsed

解决方案


sed -r "\%some_file_name($|[[:space:]]|\{)%,\%\}%{s/something/something_replaced/}" "file.txt"

-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

推荐阅读