我想用一些文本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
感谢您的帮助, 预先感谢
答案 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
\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