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.*?BBB
will match ).AAA foo1 BBB
AAA foo1 BBB AAA bar BBB
이 -z
매개변수는 줄 바꿈 대신 NUL 문자로 줄을 구분하므로 정규식이 여러 줄을 처리할 수 있습니다.
입력 예:
keep1 AAA remove1
remove2
remove3 BBB keep3
출력 예:
keep1 BBB keep3