Perl 基于位置/偏移的替换

Perl 基于位置/偏移的替换,perl,awk,sed,Perl,Awk,Sed,我想用一些文本XXXXXXXXX替换位置11到18的文本 例如:0123456789abcdeg123456efsgtext1234500th23sdfksbfk 在上一行中,我的脚本用xxxxxxxx替换了abcdeg1(位置11到18) 为此,我使用下面的脚本 perl-pe的/^(.{10})。{8}/$1xxxxxxxxxxxxxxx/'awktest.2019>awktest.2019masked.txt 现在的问题是,即使在这些位置(11到18)它是空的,它也会在每一行中重新调整 有

我想用一些文本XXXXXXXXX替换位置11到18的文本

例如:0123456789abcdeg123456efsgtext1234500th23sdfksbfk

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

现在的问题是,即使在这些位置(11到18)它是空的,它也会在每一行中重新调整

有人能帮我在我只想替换的脚本中添加空检查吗?下面的命令中的组不为空。(如何在下面的命令中添加空检查)

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

感谢您的帮助,
提前感谢

根据您的描述,替换已经发生在您在位置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
    ),请参见

使用class\S;没有空格字符

a=0123456789abcdeg123456efsgtext1234500th23sdfksbfk

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

0123456789xxxxxxxxxxxxxxxxx3456efsgtext1234500th23sdfksbfk
a=0123456789abcdeg123456efsgtext1234500th23sdfksbfk

$echo$a | perl-pe’s/(?请用代码标记包装您的示例,然后让我们知道。请描述当行长度小于18个字符时应该发生什么。您说“即使它是空的”和“仅被捕获组不为空”似乎是矛盾的。添加一个示例。