sed를 사용하여 마지막 두 개 [end]를 제거하시겠습니까?

sed를 사용하여 마지막 두 개 [end]를 제거하시겠습니까?

"메뉴"를 개선하기 위한 스크립트 를 작성 중인데 fluxbox스크립트에 다음 줄이 있습니다.

sed -i 's/\[end]//g' ~/.fluxbox/menu;sed -i '/^\s*$/d' ~/.fluxbox/menu

하지만 이는 불행한 결과를 초래할 수 있습니다모두나쁜 점은 파일에서 마지막 두 항목 [end]만 삭제하고 싶습니다 . [end]그럼 어떻게 해야 하나요?

답변1

가장 간단한 것은 아마도 perl'를 사용하는 것입니다.흡연모델:

perl -0777 -pi -e 's/(.*)\[end]/$1/s;s/(.*)\[end]/$1/s;s/^\s*\n//gm' ~/.fluxbox/menu

답변2

perlslurp 모드 와 유사하게 sed전체 파일을 홀딩 버퍼(“홀딩 공간”)로 읽을 수 있으므로 파일 내용이 “패턴 공간”에서 단일 라인으로 처리될 수 있습니다(자세한 내용은 참조).sed 및 여러 줄 검색 및 바꾸기).

한 줄의 코드만으로 sed정규식의 욕심 ​​많은 특성 으로 [end]인해 주어진 파일에서 마지막 두 항목을 쉽게 제거할 수 있습니다(Perl 정규식과 거의 동일한 논리).Stephane Chazelas가 승인한 솔루션).

#sed -i -n -e '1h;1!H;${;g; s/\(.*\)\[end\]/\1/; s/\(.*\)\[end\]/\1/; p;}'  file  # does not work on Mac OS X 10.6.8
sed -n -i -e '1h;1!H;${;g; s/\(.*\)\[end\]/\1/; s/\(.*\)\[end\]/\1/; p;}' file   # note: -n precedes -i

# ... plus deleting all blank lines
sed -n -i -e '1h;1!H;${;g; s/\(.*\)\[end\]/\1/; s/\(.*\)\[end\]/\1/; s/^[[:space:]]*\n//; s/\n[[:space:]]*$//; s/\n[[:space:]]*\n/\
/g; p;}' file

관련 정보