다음 문자열을 고려해보세요.
문서
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