【发布时间】:2019-05-20 06:36:19
【问题描述】:
使用 GNU sed,我尝试替换文件中第一次出现的模式,但如果匹配之前有另一个模式,我不想替换。
例如,如果文件包含带有“bird [number]”的行,如果此模式之前没有任何“cat”字样,我想用“0”替换数字。
示例文字
dog cat - fish bird 123
dog fish - bird 1234567
dog - cat fish, lion bird 3456
预期结果:
dog cat - fish bird 123
dog fish - bird 0
dog - cat fish, lion bird 3456
我尝试结合 How to use sed to replace only the first occurrence in a file? 和 Sed regex and substring negation 解决方案并想出了类似的东西
sed -E '0,/cat.*bird +[0-9]+/b;/(bird +)[0-9]+/ s//\10/'
如果cat.*bird +[0-9]+ 模式不匹配,0,/cat.*bird +[0-9]+/b;/(bird +)[0-9]+/ 应该匹配第一次出现的(bird +)[0-9]+,但我明白了
dog cat - fish bird 123
dog fish - bird 0
dog - cat fish, lion bird 0
第三行也改变了。我该如何预防?我认为它与地址范围有关,但我不明白如何否定地址范围的第二部分。
【问题讨论】:
标签: sed