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 があります。

各インスタンスを 1 行に 1 つずつ検索し、その直後のすべてのテキストを置き換える必要があります。

私は何かをしようとしていた

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

テキストの後の2桁の数字でしか機能しないことはわかっていますが、それを見つけたり置き換えたりすることさえありません。

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 桁、2 桁、または 3 桁の数字が続くものと一致し、それを "\1" として保存すると、その後のすべてに一致します。次に、一致した文字列を「\1」に置き換えます(保存された部分であり、選択した.

于 2012-09-10T20:50:10.397 に答える
0

これは解決済みですが、後世のために Perl ソリューションを投稿しています。

まず、-i フラグは引数 (インプレース編集用のバックアップ ファイルの拡張子) を取るため、フラグは意図したとおりに処理されますが、意図したとおりに-pieは処理され-p -ieません。単独でバックアップを無効にします。とにかく:-p -i -e-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 に答える