bash - 替换多个模式,但不是用相同的字符串

标签 bash sed

是否可以在同一命令中将乘法模式更改为不同的值? 假设我有

A B C D ABC

我想将每个 A 更改为 1,每个 B 更改为 2,每个 C 更改为 3

所以输出将是

1 2 3 D 123

因为我有 3 种模式要更改,所以我想避免分别替换它们。 我以为会有类似的东西

sed -r s/'(A|B|C)'/(1|2|3)/ 

当然,这只是将 A 或 B 或 C 替换为 (1|2|3)。 我应该提一下,我的真实模式比那更复杂......

谢谢!

最佳答案

sed 中很简单:

sed 's/WORD1/NEW_WORD1/g;s/WORD2/NEW_WORD2/g;s/WORD3/NEW_WORD3/g'

您可以在同一行上用;分隔多个命令


更新

可能这太简单了。 NeronLeVelu指出上述命令可能会导致不需要的结果,因为第二次替换甚至可能触及第一次替换的结果(依此类推)。

如果您关心这一点,可以使用 t 命令避免这种副作用。 t 命令分支到脚本的末尾,但前提是确实发生了替换:

sed 's/WORD1/NEW_WORD1/g;t;s/WORD2/NEW_WORD2/g;t;s/WORD3/NEW_WORD3/g'  

关于bash - 替换多个模式,但不是用相同的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29606527/

相关文章:

c - Bash 作为 C 库?

shell - 使用 sed 或 grep 替换行中的子字符串

linux - bash 脚本删除一些字符

regex - sed错误: "invalid reference\1 on ` s' command's RHS"

bash - 为什么我的 bash 脚本会阻塞?

bash - grepping 顶部输出时出现未知符号条目

bash - 我可以在不使用 cat 的情况下有条件地将 shell 函数作为管道 "disappear"吗?

java - 如何在 bash 变量中存储受计数影响的 PostgreSQL 插入查询行

linux - 如何查找网络接口(interface)名称

mysql - 删除 csv 文件中最多第 N 个模式匹配实例的文本