首页 > 解决方案 > Bash:根据匹配的子字符串替换一列中的整个字符串

问题描述

我有一个包含许多列和行的大文件。我想根据我要替换的所有字符串共有的子字符串替换第一列中的整个字符串。这是我所拥有的一个例子:

AAA_1765 866 HTG
AAA_1873 987 IGA
AAA_1922 413 BOK

我希望第一列中包含子字符串 AAA_1 的所有字符串都完全替换为另一个字符串,使其看起来像这样:

BBB_2 866 HTG
BBB_2 987 IGA
BBB_2 413 BOK

我一直在使用 sed 进行搜索/替换:

sed 's/^AAA_1*/BBB_2/' infile.txt >outfile.txt
sed 's/^AAA_1.*/BBB_2/' infile.txt >outfile.txt

但是第一次使用仅将子字符串 AAA_1 替换为 BBB_2 并保留字符串的其余部分(我希望将整个字符串替换为 BBB_2),第二次使用将整行替换为 BBB_2(我只想要第一列中的字符串替换)。

也许 awk 是我需要的?任何建议都会有所帮助。

标签: bashshellawksed

解决方案


AAA_1使用后您可以匹配任何 0+ 位

sed 's/^AAA_1[0-9]*/BBB_2/' infile.txt > outfile.txt

请参阅在线sed演示

这个正则表达式匹配

  • ^- 行首 - AAA_1- 文字子串
  • [0-9]*- 零个或多个数字(如果表示任何非空格,您可以将其替换为[^ ]*

推荐阅读