【问题标题】:Replacing a fixed-position character field using Perl or sed使用 Perl 或 sed 替换固定位置的字符字段
【发布时间】:2013-10-14 19:47:04
【问题描述】:

我需要替换文件每一行中特定范围的字符。

我试过了

    perl -i -pe 'r77,79c/XXX/g' file

我正在尝试使用 Perl 将第 77 到第 79 个字符更改为 XXX,但上面的代码不起作用。

【问题讨论】:

  • 您要替换文件中的每一行,还是替换整个文件?
  • 真的认为r77,79c/XXX/g是有效的Perl吗?
  • 实际上我想在文件中搜索一个模式,并且任何与该模式匹配的行都需要替换为 XX 的第 50 和第 51 个字符。
  • 什么?!那是一个完全不同的问题。也不是很清楚。我建议你写一个新问题并举个例子,如果你觉得很难准确地表达你需要什么。可能是perl -pe 'substr($_,49,2)="XX" if /pattern/' 之类的?

标签: regex perl ksh


【解决方案1】:

您想将位置 [77-79] 的字符替换为 XXX?

试试

 perl -i -piorig_* -e "substr($_,76,3)=XXX" file

将创建一个名为 orig_file 的备份文件,以防止可能的数据丢失..

【讨论】:

  • 我会这样做,但是 "77th to 79th" 字符更有可能是substr($_,76,3)。使用substr 作为左值经常被忽略。
  • @Kenosis' 对另一个问题的评论向我表明,如果记录短于 79 个字符(不包括换行符),此方法将删除尾随换行符。这很可能永远不会发生,但您可能必须先chomp,然后在修复后print $_, "\n"
【解决方案2】:
perl -i -pe 's/.{76}\K.../XXX/' file

【讨论】:

  • 您不需要s 修饰符吗?
  • @Kenosis:这被应用到文件中的每一行,所以除非有短于79个字符的数据行,如果是这样的话,换行应该被覆盖,然后/s 是不必要的。
  • @Borodin - 明白了。再次感谢您。
【解决方案3】:

你写道:

Actually i want to search a pattern in a file and whatever lines matching that pattern needs to be replaced to 50th & 51st character to XX

使用 sed:

sed -r '/pattern/s/^(.{49})..(.*)$/\1XX\2/' file

【讨论】:

    【解决方案4】:
    sed "/pattern/ s/^\(.\{49\}\)../\1XX/" YourFile
    

    我们不会触及终点

    【讨论】:

      猜你喜欢
      • 2014-08-19
      • 2015-11-18
      • 2020-11-15
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多