【问题标题】:Different replacements for different patterns in sedsed中不同模式的不同替换
【发布时间】:2011-09-06 02:16:59
【问题描述】:

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

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

【问题讨论】:

  • 对于任何给定的输入,什么是有效输出还不是很清楚,你能举个例子吗?
  • @heltonbiker 抱歉,我更新了问题。
  • 你说'a1 ...替换了a2'(意思是用a1替换a2的出现)但你的例子建议'a1 ...替换为a2'(意思是用a2替换a1的出现) ;你真正想要的是哪个?
  • 为什么在第 1 行和第 3 行,相同的输入会得到不同的输出?
  • @Jonathon 抱歉,我想我应该更多地校对我的问题。

标签: linux unix sed text-editor


【解决方案1】:

有多种方法可以做到。

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/

【讨论】:

  • @Jonathon 谢谢,你们 UNIX 的人很快就回复了 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 2020-08-02
相关资源
最近更新 更多