Perl 基于位置/偏移的替换
我想用一些文本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 感谢您的帮助,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)它是空的,它也会在每一行中重新调整 有
提前感谢根据您的描述,替换已经发生在您在位置11-18处标识为空的行中,因此至少有8个匹配字符,但您可能看不到。很可能这些只是空白。如果是这种情况,您只需在模式中添加一个正向前瞻锚,以确保在接下来的8个字符中至少有一个非空白:
perl -lpe 's/^(.{10})(?=.{0,7}\S).{8}/$1xxxxxxxxxxxxxxxxx/' file
在添加的子模式中(?=.{0,7}\S):
是正向前瞻锚,在匹配中不消耗字符,可以用作条件检查(?=…)
表示0-7个字符(换行符除外),后跟非空白{0,7}\S
。这是为了确保在接下来的8个字符中,至少有一个匹配的\S
\S
- 为确保匹配项在位置11-18中至少包含一个可见字符,您可以将
更改为\S
,其中包括所有不可打印字符和空格的背面([^\x00-\x20]
),请参见\x20
a=0123456789abcdeg123456efsgtext1234500th23sdfksbfk
$ echo $a| perl -pe 's/(?<=^.{10})\S{8}/xxxxxxxxxxxxxxxxx/'
0123456789xxxxxxxxxxxxxxxxx3456efsgtext1234500th23sdfksbfk
a=0123456789abcdeg123456efsgtext1234500th23sdfksbfk
$echo$a | perl-pe’s/(?请用代码标记包装您的示例,然后让我们知道。请描述当行长度小于18个字符时应该发生什么。您说“即使它是空的”和“仅被捕获组不为空”似乎是矛盾的。添加一个示例。