【问题标题】:replace a fixed position in a file with a set string用设置的字符串替换文件中的固定位置
【发布时间】:2021-12-28 18:09:34
【问题描述】:

您好,我希望执行以下操作:

file= sample.out

10-15 位置的任何文本替换为"77777",但仅限于以ABC 开头的行

目前为止:

cat sample.out | sed -r 's/^ABC(.{9})/\177777/'

但行首的ABC 被删除,77777 被插入到文本位置,而不是替换该位置的现有字符。

【问题讨论】:

    标签: parsing sed cut


    【解决方案1】:

    没有例子我用这个。

    文件:repl.txt

    0000000001111111111222222222233333333333
    1234567890123456789012345678901234567890
    ABCDEFGH<12345>IJKLMNOPQRSTUVWXYZ======:
    

    使用这个命令:

    $ sed -e 's/^\(ABC.\{6\}\).\{5\}\(.*\)$/\177777\2/' repl.txt
    0000000001111111111222222222233333333333
    1234567890123456789012345678901234567890
    ABCDEFGH<77777>IJKLMNOPQRSTUVWXYZ======:
    

    【讨论】:

    • 为了提高 Arnaud Valmary 答案的可读性,我将添加 -r 或 -E 以删除转义字符:sed -r 's/^(ABC.{6})。{5}( .*)$/\177777\2/' file.txt ( ) 下的任何内容都是您的捕获组,您将其称为 \1 或 \2
    • 谢谢你的工作,并感谢 PraveenB 的进一步解释,帮助我理解
    【解决方案2】:

    请使用@Arnaud 帖子中的示例尝试关注awk 程序。

    awk -v newVal="77777" '/^ABC/{print substr($0,1,9) newVal substr($0,16);next} 1' Input_file
    

    解释: 简单的解释是,在这里使用awk 程序。首先创建一个名为newValawk 变量,其中包含77777 值。在主程序中检查行是否从 ABC 开始,然后打印子字符串(打印当前行中第 10 到 15 位以外的所有内容,在其位置打印新值)。如果不满足条件(即:行不是从 ABC 开始),则简单地打印该行。

    【讨论】:

      【解决方案3】:

      这可能对你有用(GNU sed):

      sed '/^ABC/{s/./&\n/14;T;s//\n&/10;s/\n.*\n/77777/}' file
      

      ABC 在行首的模式匹配,用换行符分隔字符 10-14(5 个字符)并将它们替换为替换字符串。

      注意使用的分隔符必须是唯一的(换行符不能是任何模式空间的一部分,因为 sed 使用换行符来定义模式空间)。此外,分隔符必须从最大到最小插入,因为换行符会打乱从行首开始的计数。


      要从特定位置覆盖,请使用:

      sed -E '/^ABC/{s/./\n&/10;T;s/$/\n77777/;:a;s/\n.(.*\n)(.)/\2\n\1/;ta;s/\n//g}' file
      

      另一种选择:

      sed -E 's/^(ABC.{6}).{5}/\177777/' file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-17
        • 2017-09-09
        • 2014-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-17
        相关资源
        最近更新 更多