【问题标题】:Bash: replace entire string in one column based on matching substringBash:根据匹配的子字符串替换一列中的整个字符串
【发布时间】:2018-10-25 20:26:47
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: bash shell awk sed


    【解决方案1】:

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

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

    请参阅online sed demo

    这个正则表达式匹配

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

    【讨论】:

    • @nrcombs 很高兴它对你有用。如果我的回答对您有帮助,也请考虑投票。
    【解决方案2】:

    一个简单的 awk 解决方案:

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

    BBB_2 866 HTG
    BBB_2 987 IGA
    BBB_2 413 BOK
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-08
      • 2019-11-08
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多