【问题标题】:Replace particular string at fixed position using sed使用 sed 在固定位置替换特定字符串
【发布时间】:2014-08-19 15:14:51
【问题描述】:

我有一个包含多行数据的简单文本文件,其中每行正好有 26 个字符。 例如

10001340100491938001945591
10001340100491951002049591
10001340100462055002108507
10001340100492124002135591
10001340100492145002156507
10001340100472204002205591

现在,如果只有这两个字符是 49,我想将第 12 和第 13 个字符替换为字符 58。

我试过这样:

sed 's/^(.{12})49/\58/' data.txt

但出现此错误:

sed: -e expression #1, char 18: invalid reference \5 on `s' command's RHS

提前致谢

【问题讨论】:

    标签: sed


    【解决方案1】:

    如果您想尝试awk 解决方案:

    awk 'substr($0,12,2)==49 {$0=substr($0,1,11)"58"substr($0,14)}1' file
    10001340100581938001945591
    10001340100581951002049591
    10001340100462055002108507
    10001340100582124002135591
    10001340100582145002156507
    10001340100472204002205591
    

    【讨论】:

      【解决方案2】:

      在您的表达式中,您将替换前 14 个字符(如果您没记错的话)。但是你需要替换 11 加上两个(12th, 13th)。更重要的是sed对转义括号很挑剔,所以\({等前面需要反斜杠。最后——捕获组的编号是1。你省略了那个数字。

      把它们放在一起,你会得到

      sed 's/^\(.\{11\}\)49/\158/'
      

      您可以在sed 中使用标志来使表达式更“常规”(改变(\( 的含义)。我相信这是什么标志取决于您的平台(sed 的版本)。

      【讨论】:

      • 这不起作用,即使它看起来与下面的类似。它不是将 49 替换为 58,而是在 49 之后附加 58 并使字符串 28 个字符变长
      • 那是因为捕获的组同时包含 11 个字符和 49 个字符。
      • @user333422 - 是的,很抱歉有字符换位。 49 必须在捕获组之外,因此在替换期间不会重复。我已经编辑了我的答案。
      【解决方案3】:

      抓到的组是\1,所以要放11个(不是12个)字符,然后58

      sed -E 's/^(.{11})49/\158/' data.txt
      

      如果您不想转义方括号和大括号,还需要 -E-r

      根据您的输入,命令在第 1、2、4 和 5 行中将 49 更改为 58

      【讨论】:

      • 这行得通。谢谢。我是第一次使用 sed。所以如果我不使用 -E 表达式会是什么样子?
      • 谢谢,我知道了。 sed 's/^(.\{11\})49/\158/' data.txt
      • @user333422 我的sed 版本是sed 's/^\(.\{11\}\)49/\158/' data.txt
      猜你喜欢
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 2017-09-17
      相关资源
      最近更新 更多