我需要在文件的每一行中替换两个模式。例如,该文件包含以下内容:

pattern1 a1 b1 c1
pattern2 a2 b2 c2
pattern1 a1 b1 c1

基本上,只要出现“pattern1”,a1就需要替换为a2,b1替换为b2,以此类推。不过,我也希望将pattern1更改为pattern2。
到目前为止,我有点接近:
/pattern1/ s/a1 b1 c1/a2 b2 c2/

注意,我想将整个sed脚本保存在一个文件中。
更新
期望输出,这可能不是最好的例子,我会回答任何问题。
pattern2 a2 b2 c2
pattern2 a2 b2 c2
pattern2 a2 b2 c2

最佳答案

有多种方法可以做到。

sed -e '/pattern1/{
        s/a2/a1/
        s/b2/b1/
        s/c2/c1/
        s/pattern1/pattern2/
        }' "$@"

通过使用分号代替换行符,通常可以将其折叠为一行(但有些版本的sed对此比其他版本更为挑剔)。在这种情况下,-e并不是绝对必要的。
从“a1”是否应该被“a2”替换或者反之亦然的问题上还不完全清楚;该代码使用了“a1需要被替换为a2”的措辞(意思是“用a1替换a2的出现”),但该示例表明了相反的替换。如果需要其他含义,则使用类似于s/a1/a2/的行,而不是s/a2/a1/

关于linux - sed中不同模式的不同替代品,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7314317/

10-13 03:26