【问题标题】:Replace substring of a string of characters with other characters in awk用awk中的其他字符替换字符串的子字符串
【发布时间】:2019-11-21 10:56:53
【问题描述】:

我有一个包含很长字符串的文件,我想用 Ns 替换它的子字符串。示例:

测试 ABCDABCDABCD

我想用awk命令和sed将它的一个子字符串替换为所有字母N,索引5到8的所有字符,所以字母N的总长度是4。

输出

ABCDNNNNABCD

我尝试过这样的事情:

awk '{ v=substr($0,5,4); sed -i "s/$v/N/g";print substr($0,1,4)""v""substr($0,9,12)}' test

然而,这个命令似乎给出了这样的输出:

ABCDABCDABC

没有替换

我想在代码中包含从哪里开始替换的索引号(例如,这里是 4)和替换的长度号(这里也是 4),所以我可以修改这些数字以防我想从另一个位置开始并进行不同长度的替换,因为实际上,我有一个包含数千个字母的字符串,我想替换数百个字符,因此在我的情况下替换模式不起作用

【问题讨论】:

  • 提问技巧——当你说“这个命令似乎不起作用”时,你应该向 bot 提供预期输出和 实际 输出,或者描述什么失败时发生。只说“不起作用”是无意义的。
  • 当然,谢谢你的提示,我修改了一下
  • 您正在尝试混合 2 个独立的程序。 sed 和 awk 不能相互使用。只需使用 awk 并写 awk '{print substr($0,1,4) "NNNN" substr($0,9)}'
  • hmm.. 我明白了,我不能使用“NNNN”,因为实际上我说我的替换是 10000 Ns,所以我必须输入 10000 次 N

标签: linux awk text-processing


【解决方案1】:

您想使用awksed?似乎您实际上想要以下之一:

$ echo ABCDABCDABCD | perl -pe 'substr($_,4,4)="NNNN"'
ABCDNNNNABCD
$ echo ABCDABCDABCD | perl -pe 'substr($_,4,4)="N"x4'
ABCDNNNNABCD

【讨论】:

  • 是的,我在我的 macbook 上试过了,它可以工作,但是当我通过 ssh 在服务器上尝试时,perl 有一些问题,我不能使用 perl,所以我正在寻找一个替代方案解决方案
  • 哦,我找到了一个解决方案,将 awk 与 gsub 结合起来
  • awk '{ v=substr($0,5,4);gsub("[^0-9.-]", "N", v);print substr($0,1,4 )""v""substr($0,9,12)}' 测试
  • 我喜欢它!,基本上我可以选择一个子字符串,将它分配给一个变量并将该变量中的所有非数字字符更改为 N 并打印修改后的字符串...很好,它来了我认为我可以这样做,因为我没有数字字符
【解决方案2】:
echo ABCDABCDABCD | awk '{$0=gensub(/ABCD/,"NNNN",2)}1'
ABCDNNNNABCD

【讨论】:

    【解决方案3】:
    $ echo 'ABCDABCDABCD' |
        awk -v b=5 -v e=8 '{
            t=substr($0,b,e-b+1); gsub(/./,"N",t); print substr($0,1,b-1) t substr($0,e+1)
        }'
    ABCDNNNNABCD
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多