linux - 带有可变结尾的 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
解决方案
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
推荐阅读
- android - 微信 SendAuth 请求访问令牌代码只有效一次
- jenkins - 我们如何通过非 gui 模式在 JMeter 脚本中获取汇总报告参数(吞吐量、接收和发送字节数)的结果?
- python - 使用 KMeans 聚类在图像上创建聚类
- sql - 创建 PLR 扩展 Postgres 时出错
- c# - 使用 Fluent Api 配置具有自身类型的 2 个属性的实体
- amazon-web-services - AWS - Guzzle 我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法
- android - Android本地化不适用于edittext
- azure-language-understanding - LUIS 未通话量配额。配额将被补充
- linux-kernel - 在 beaglebone black 上卸载 mmcblk1p1 时出错 - 在重新分区和格式化期间
- android - 正面、负面和中性按钮在我的应用程序中不可见