</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
-s
sed에게 각 파일을 개별적으로 처리하도록 지시합니다.
모든 파일이 완료되기 전에 종료 하고 싶지 않기 때문에 나머지 줄이 아닌 sed
처음부터 인쇄하도록 변경합니다 . 명시적으로 요청하지 않는 한 인쇄하지 말라고 sed에 지시합니다. 이 명령은 sed에게 파일의 시작 부분부터 일치하는 첫 번째 줄까지 모든 줄을 인쇄하도록 지시합니다 .<\/foo:bar>
-n
0,/<\/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
로드 하려고 하면 누군가가 해당 디렉터리에 악성 코드를 심었을 수 있습니다. 시스템과 함께 제공되는 확장 프로그램 의 경로 는 다를 수 있습니다. 출력을 참조하세요.inplace
inplace
inplace.awk
inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'
답변3
파일을 내부 편집하면 파일이 손상될 수 있습니다. 대신 다음 예와 같이 변경 사항을 새 파일에 씁니다.
find . -maxdepth 1 -iname "*.txt" -print0 | parallel -0 "sed 's/&/\&/g; s/</\</g; s/>/\>/g; s/\"/\"/g; s/'\"'\"'/\'/g' {} > {}_Html_Passed.txt"
위의 sed 명령은 각 파일을 읽고 병렬 명령(참조: 병렬 설치) 이를 해당 새 출력 파일에 씁니다.
또한 sed 명령 내의 큰따옴표는 병렬 명령 자체에서 필요하므로 \로 이스케이프해야 합니다.
find 명령의 -maxlength 값은 필요에 따라 조정될 수 있습니다.
이 코드는 브라우저 렌더링 문제 없이 웹에 모든 종류의 스크립트를 게시하려는 사람들에게도 도움이 될 것입니다. 또한 html pre 태그를 사용하여 스크립트를 둘러싸는 것도 도움이 됩니다.
원천:내 오픈소스 프로젝트