在正则表达式模式后替换数据

时间:2012-09-10 20:32:27

标签: regex perl

我有一个日志文件,其中包含我需要屏蔽/替换的数据。

测试文件示例

20120910:181649:TID=000ef4:Add       :C155:E076:P:     eTDYN-str-multi-109(String to replace)
20120910:181649:TID=000ef4:Add       :C155:E076:P:     eTDYN-str-multi-106(String to replace)
20120910:181649:TID=000ef4:Add       :C155:E076:P:     eTDYN-str-multi-104(String to replace)
20120910:181649:TID=000ef4:Add       :C155:E076:P:     eTDYN-str-multi-102(String to replace)
20120910:181649:TID=000ef4:Add       :C155:E076:P:     eTDYN-str-multi-18(String to replace)

它有更多的eTDYN-str,01-110。

我需要找到每个实例,每行一个,然后直接替换所有文本。

我正在尝试像

这样的东西
perl -pie 's/^(eTDYN-str-multi-\d\d:\s+).*/$1<removed pii data>/g;' logtest.txt

我知道它只适用于文本后面的两位数字,但它甚至找不到/替换它。

2 个答案:

答案 0 :(得分:1)

使用sed执行以下操作:

sed 's/\(eTDYN-str-multi-[0-9]\{1,3\}\).*/\1<REPLACEMENT_STRING>/' <name of your test file>

这将匹配文字“eTDYN-str-multi-”,后跟一个,两个或三个数字,保存为“\ 1”,之后将匹配任何内容。然后它将用匹配的字符串替换为“\ 1”(保存的部分和您选择的。

答案 1 :(得分:0)

虽然这已经解决,但我正在为后代发布一个Perl解决方案:

首先,-pie标志被视为-p -ie而不是-p -i -e,因为-i标志采用了一个参数,就地文件的扩展名为就地编辑。 -i本身会禁用备份。但无论如何:

$ pbpaste|perl -pe's/eTDYN-str-multi-\d{1,3}\K.*/<removed pii data>/'
20120910:181649:TID=000ef4:Add       :C155:E076:P:     eTDYN-str-multi-109<removed pii data>
20120910:181649:TID=000ef4:Add       :C155:E076:P:     eTDYN-str-multi-106<removed pii data>
20120910:181649:TID=000ef4:Add       :C155:E076:P:     eTDYN-str-multi-104<removed pii data>
20120910:181649:TID=000ef4:Add       :C155:E076:P:     eTDYN-str-multi-102<removed pii data>
20120910:181649:TID=000ef4:Add       :C155:E076:P:     eTDYN-str-multi-18<removed pii data>

使用\K或'保持'转义documented in perlre

  

由于各种原因,K可能比等效的(?<=...)构造更有效,并且在您希望有效地删除字符串中的其他内容的情况下,它尤其有用。例如

s/(foo)bar/$1/g;
  

可以重写为效率更高的

s/foo\Kbar//g;