Bash:根据匹配的子字符串将整个字符串替换为一列

时间:2018-10-25 20:26:48

标签: bash shell awk sed

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

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?任何建议都会有所帮助。

2 个答案:

答案 0 :(得分:0)

您可以使用{p>匹配AAA_1之后的任何0+数字

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

请参见online sed demo

此正则表达式匹配

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

答案 1 :(得分:0)

一个简单的awk解决方案:

private Dictionary<string, Function> ops = new Dictionary<string, Function> {
    {"foo", int (int a, int b) { return a + b } }
};

awk '/^AAA_1/ { $1 = "BBB_2" } 1' file