![如何在多个关键字/模式匹配后替换行的子字符串](https://linux22.com/image/188237/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%A4%9A%E4%B8%AA%E5%85%B3%E9%94%AE%E5%AD%97%2F%E6%A8%A1%E5%BC%8F%E5%8C%B9%E9%85%8D%E5%90%8E%E6%9B%BF%E6%8D%A2%E8%A1%8C%E7%9A%84%E5%AD%90%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我需要浏览数千个文件并找到以
# disabledRule:
在这些行中,我需要查找一系列关键字,即fileinto
orfileinto_copy
后跟create
and target
。例子:
{s:4:"type";s:8:"fileinto";s:6:"create";b:0;s:6:"target";s:5:"PATTERN";}
{s:4:"type";s:13:"fileinto_copy";s:6:"create";b:0;s:6:"target";s:5:"PATTERN";}
在这些关键字之后,我需要修改 PATTERN 并替换.
为/
.
PATTERN 可以包含几乎任何字符,例如
simple.folder.structure
more.complex.[department_1] @employee-XY
关键字之间的部分可能略有不同,整个“关键字+模式”模式可以在一行中出现多次。
这听起来很容易,但我无法找到一种方法让它在sed
不awk
编写大脚本并拆开台词的情况下工作。我认为我很擅长sed
替换东西并找到模式,但我不知道如何将替换限制为仅模式。
有什么建议可以让我在不写更长的脚本的情况下使用什么来做到这一点?有没有办法处理sed
捕获组?
更新:正如一些人可能已经发现的那样,由于迁移而需要修改文件。我们知道新软件并不完全兼容,但事实证明,新软件根本无法识别上述行“#disabledRule”,因此从这个角度来看,问题无法解决。
答案1
是的,您可能可以使用 的地址范围sed
,但您无法判断某个# disabledRule:
部分何时结束。例如,如果它在下一个空行处结束,并且给定的行中在线条图案之外没有其他点filecopy
,则非常简单:
sed '/^# disabledRule:$/,/^$/s_\._/_g'
但在这种情况下你可能不会问。这对关键字进行附加过滤:
sed '/^# disabledRule:$/,/^$/{/"fileinto\(_copy\)*".*"create".*"target"/s_\._/_g;}'
如果这仍然不符合您的要求,请进一步调整或解释更多细节,最多给出更长的文件示例。