bash를 사용하여 여러 줄 문자열을 삭제하는 방법은 무엇입니까?

bash를 사용하여 여러 줄 문자열을 삭제하는 방법은 무엇입니까?

다음 문자열을 고려해보세요.

문서

This is some text
<#
Love this or that
#>
He is running like a rabbit

예를 들어 개행 문자열 ID를 grep하려면 다음을 사용하세요.

cat file | grep -Pzo '(?s)<#.*?#>'

그러면 다음이 출력됩니다.

<#
Love this or that
#> 

하지만 내가 원한다면 어쩌지?제거하다대회? 어떻게 해야 합니까?

답변1

당신은 이것을 할 수 있습니다sed

sed '/<#/,/#>/d' file

두 개의 특정 문자열 사이의 텍스트를 제거합니다.

답변2

-P(GNU 확장)은 P실제로 erl 정규 표현식용이므로 다음과 같습니다.

<file perl -0777 -pe 's/<#.*?#>//sg'

답변3

필요하지 않은 경우 grep다음을 수행할 수 있습니다 awk.

awk 'BEGIN {p=1}; $1 == "<#" {p=0}; $1 == "#>" {p=1; next}; p == 1 {print}' file

p그러면 시작할 때 내부 플래그가 1로 설정되고, 0"제외 시작" 패턴이 발견되면 1로 설정되며, "제외 종료"가 발견되면 다시 1로 설정됩니다. 그런 다음 p가 1인 줄만 인쇄합니다. next끝 패턴이 인쇄되는 것을 방지하려면 끝과 일치하는 데 사용되는 규칙의 명령문이 필요합니다.

답변4

이것이 우아한 것인지 모르겠습니다. 나는 그것에 대해 생각했습니다.

tr "\n" "%" < file | sed -e 's/<#%.*#>%//' | tr "%" "\n"

새 줄을 다음으로 바꾸십시오.%

tr "\n" "%"

다음 사이의 모든 것을 교체하십시오 <#%...#>%.

sed -e 's/<#%.*#>%//'

%새 줄로 바꾸십시오 .

tr "$" "\n"

산출:

This is some text
He is running like a rabbit

관련 정보