複数行のテキスト文字列を含むテキストファイルがあり、ファイルをスキャンしてその複数行のすべてのインスタンスを削除し、時には見つかった重複文字列を削除しようとします。
例の文字列:
recursive-test yes;
test-limit{
tests 10;
};
location "testLoc" {
type test;
};
location "testLoc2"{
type test;
file "/etc/var/test.sql";
};
include "/etc/var/test.conf";
};
recursive-test yes;
test-limit{
tests 10;
};
location "testLoc" {
type test;
};
location "testLoc2"{
type test;
file "/etc/var/test.sql";
};
include "/etc/var/test.conf";
};
otherTestTextHere
123
321
recursive-test yes;
test-limit{
tests 10;
};
location "testLoc" {
type test;
};
location "testLoc2"{
type test;
file "/etc/var/test.sql";
};
include "/etc/var/test.conf";
};
ご覧のとおり、テキストファイルで繰り返されるテキスト文字列は、文字列の先頭から複数行の終わりまで常に同じです。
recursive-test yes;
test-limit{
tests 10;
};
location "testLoc" {
type test;
};
location "testLoc2"{
type test;
file "/etc/var/test.sql";
};
include "/etc/var/test.conf";
};
複数行の文字列は通常繰り返すべきではありませんが、安全なデバイスとしてすべてのインスタンスを検索し、何らかの理由でテキストファイルに書き込む他のアプリから文字列が表示された場合に文字列を削除する方法も探しています。完全に削除してください。プログラムで繰り返されるとき。
を使用すると、sed
一度に1行だけ削除する方法がわかりましたが、時には複数行文字列の特定の行にある単語が他の同様の複数行文字列に表示されますが、維持したいので機能しませんでした。私は、文字列の最初から最後まで、この複数行の文字列の「正確な」重複項目を検索したいと思います。
1行のコマンドライン/最適化を維持したいと思います。
答え1
OPに空白行で区切られたテキストブロックがあり、OPがすべての重複エントリを削除しようとしていることを理解する方法は次のとおりです。
awk -v RS='\n\n' -v ORS="\n\n" '!seen[$0]++' file
OPがブロックを削除したい場合は、GNU sedで試してください。
sed -z 's~recursive-test yes;\ntest-limit{\ntests 10;\n};\nlocation "testLoc" {\ntype test;\n};\nlocation "testLoc2"{\ntype test;\nfile "/etc/var/test.sql";\n};\ninclude "/etc/var/test.conf";\n};~~g' file
答え2
< input python -c 'import sys; sys.stdout.write(sys.stdin.read().replace("""recursive-test yes;\ntest-limit{\ntests 10;\n};\nlocation "testLoc" {\ntype test;\n};\nlocation "testLoc2"{\ntype test;\nfile "/etc/var/test.sql";\n};\ninclude "/etc/var/test.conf";\n};""", ""))'
Pythonの三重引用符("""
)は、文字列から引用符をエスケープせずに一致させるのに役立ちます。