基于位置/偏移的替换

时间:2019-04-05 09:24:57

标签: perl awk sed

我想用一些文本xxxxxxxxxx替换位置11至18的文本

例如:0123456789 abcdeg1 23456efsgtext1234500th23sdfksbfk

在上一行中,我的脚本将 abcdeg1 (位置11至18)替换为xxxxxxxx 为此,我正在使用以下脚本  perl -pe's / ^(。{10})。{8} / $ 1xxxxxxxxxxxxxxxxx /'awktest.2019> awktest.2019masked.txt

现在的问题是,即使在那些位置(11到18)处为空,它也在每行中都替换

有人可以帮助我在我想替换的脚本中添加空值检查吗?以下命令中如何添加空值检查(如何在下面的命令中添加空值检查)

perl -pe's / ^(。{10})。{8} / $ 1xxxxxxxxxxxxxxxxx /'awktest.2019> awktest.2019masked.txt

感谢您的帮助, 预先感谢

2 个答案:

答案 0 :(得分:1)

根据您的描述,替换已经发生在您定位为 11-18 的空行中,因此至少有8个匹配的字符,但您可能看不到。这些很可能只是空白。如果是这样,您可以在模式中添加一个正向超前锚,以确保接下来的8个字符中至少有一个非空格:

perl -lpe 's/^(.{10})(?=.{0,7}\S).{8}/$1xxxxxxxxxxxxxxxxx/' file

在添加的子模式 (?=.{0,7}\S) 中:

  • (?=...)是正向超前锚,它在匹配中不消耗任何字符,可以用作条件检查
  • .{0,7}\S表示0-7任意字符(换行符除外),后跟非空格\S。这是为了确保在接下来的8个字符中,至少有一个匹配的\S
  • 为确保匹配在位置 11-18 中至少包含一个可见的字符,您可以将\S更改为[^\x00-\x20],其中包括所有不可打印的字符字符和空格(\x20),请参见https://web.itu.edu.tr/sgunduz/courses/mikroisl/ascii.html上的表

答案 1 :(得分:0)

使用类\ S;没有空格字符。

a=0123456789abcdeg123456efsgtext1234500th23sdfksbfk

$ echo $a| perl -pe 's/(?<=^.{10})\S{8}/xxxxxxxxxxxxxxxxx/'

0123456789xxxxxxxxxxxxxxxxx3456efsgtext1234500th23sdfksbfk