여러 줄의 텍스트 문자열이 포함된 텍스트 파일이 있고 파일을 스캔하여 해당 여러 줄의 모든 인스턴스를 제거하고 때로는 발견된 중복 문자열을 제거하려고 합니다.
예시 문자열:
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
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의 삼중 따옴표( """
)는 문자열에서 따옴표를 이스케이프하지 않고도 일치시키는 데 유용합니다.