1

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

测试文件示例

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

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

4

2 回答 2

1

使用 sed 执行以下操作:

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

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

于 2012-09-10T20:50:10.397 回答
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>

使用perlre 中记录\K的or 'keep' 转义:

由于各种原因,\K 可能比等效(?<=...)构造更有效,并且在您想要有效地删除字符串中其他内容之后的某些内容的情况下,它特别有用。例如

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

可以重写为更有效的

s/foo\Kbar//g;
于 2012-09-11T02:24:06.863 回答