我有一个日志文件,其中包含我需要屏蔽/替换的数据。
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
我知道它只适用于文本后面的两位数字,但它甚至找不到/替换它。
答案 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;