Sed 명령 및 줄 삭제

Sed 명령 및 줄 삭제

Bash 스크립트에서 AAA(포함)부터 BBB(제외)까지 모든 항목을 제거해 보았습니다. 따라서 AAA부터 BBB, BBB까지 모든 항목을 계속 내보냅니다. 아래 줄을 생각해 냈는데 실수로 BBB도 제거됩니다. 도움을 주셔서 감사합니다.

sed -i '/AAA/,/BBB/d' file.txt

답변1

AAA와 가 BBB줄의 시작 부분에 있는 경우

sed를 사용하여 끝 패턴을 제외한 행 범위 삭제귀하의 질문에 대한 답변이 있습니다:

sed -i '/AAA/,/BBB/{/BBB/!d}' file.txt

입력 예:

AAA remove1
remove2
BBB keep3

출력 예:

BBB keep3

줄 중간 어딘가에 나타날 수 있는 경우

정규 표현식을 사용할 수 있습니다:

sed -izE 's/(.*?)AAA.*?(BBB.*)/\1\2/g' file.txt

\1괄호는 정규식의 일부를 그룹화하므로 나중에 \2(첫 번째 캡처 그룹) 및 (두 번째 캡처 그룹)을 통해 해당 내용을 참조할 수 있습니다. .*모든 문자( .)를 0회 이상( *) 일치합니다. 아래 물음표는 *가능한 가장 짧은 문자열과 일치하도록 "게으른" 상태로 만듭니다( 대신 AAA foo1 BBB AAA bar2 BBB AAA.*?BBBwill match ).AAA foo1 BBBAAA foo1 BBB AAA bar BBB

-z매개변수는 줄 바꿈 대신 NUL 문자로 줄을 구분하므로 정규식이 여러 줄을 처리할 수 있습니다.

입력 예:

keep1 AAA remove1
remove2
remove3 BBB keep3

출력 예:

keep1 BBB keep3

관련 정보