sed - 여러 파일에 변경 사항 적용

sed - 여러 파일에 변경 사항 적용

</foo:bar>" "을(를) 포함하는 수백 개의 파일이 있습니다 .

cc
bb
aa
</foo:bar>
dd
xx
vv

한꺼번에 바꾸고 싶어요

cc
bb
aa
</foo:bar>

sed는 정확한 파일 이름을 지정하면 제대로 작동합니다.

sed -i "/</foo:bar>/q" 99999.txt

하지만 한꺼번에 모두 변경하려고 하면 아무런 결과도 얻지 못합니다.

 sed -i "/<\/foo:bar>/q" *.txt

답변1

노력하다:

sed -s -n -i '0,/<\/foo:bar>/p' *.txt

-ssed에게 각 파일을 개별적으로 처리하도록 지시합니다.

모든 파일이 완료되기 전에 종료 하고 싶지 않기 때문에 나머지 줄이 아닌 sed처음부터 인쇄하도록 변경합니다 . 명시적으로 요청하지 않는 한 인쇄하지 말라고 sed에 지시합니다. 이 명령은 sed에게 파일의 시작 부분부터 일치하는 첫 번째 줄까지 모든 줄을 인쇄하도록 지시합니다 .<\/foo:bar>-n0,/<\/foo:bar>/p<\/foo:bar>

-s옵션은 BSD/OSX sed에서는 작동하지 않습니다.

답변2

</foo:bar>파일이 발견되면 읽기를 중지하려면 다음을 수행하세요.

GNU 사용 awk:

gawk -i /usr/share/awk/inplace.awk '{print}; $0 == "</foo:bar>" {nextfile}' ./*.txt

그리고 perl:

perl -ni -e 'print; close ARGV if $_ eq "</foo:bar>\n"' ./*.txt

존재하다 gawk,사용하지 마세요-i inplace현재 작업 디렉터리(as or)에서 확장 기능을 먼저 gawk로드 하려고 하면 누군가가 해당 디렉터리에 악성 코드를 심었을 수 있습니다. 시스템과 함께 제공되는 확장 프로그램 의 경로 는 다를 수 있습니다. 출력을 참조하세요.inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

답변3

파일을 내부 편집하면 파일이 손상될 수 있습니다. 대신 다음 예와 같이 변경 사항을 새 파일에 씁니다.

find . -maxdepth 1 -iname "*.txt" -print0 | parallel -0 "sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g; s/\"/\&quot;/g; s/'\"'\"'/\&#39;/g' {} > {}_Html_Passed.txt"

위의 sed 명령은 각 파일을 읽고 병렬 명령(참조: 병렬 설치) 이를 해당 새 출력 파일에 씁니다.

또한 sed 명령 내의 큰따옴표는 병렬 명령 자체에서 필요하므로 \로 이스케이프해야 합니다.

find 명령의 -maxlength 값은 필요에 따라 조정될 수 있습니다.

이 코드는 브라우저 렌더링 문제 없이 웹에 모든 종류의 스크립트를 게시하려는 사람들에게도 도움이 될 것입니다. 또한 html pre 태그를 사용하여 스크립트를 둘러싸는 것도 도움이 됩니다.

원천:내 오픈소스 프로젝트

관련 정보