[string] sed / grep을 사용하여 두 단어 사이의 텍스트를 추출하는 방법은 무엇입니까?

문자열의 두 단어 사이에있는 모든 것을 포함하는 문자열을 출력하려고합니다.

입력:

"Here is a String"

산출:

"is a"

사용 :

sed -n '/Here/,/String/p'

엔드 포인트를 포함하지만 포함하고 싶지 않습니다.



답변

sed -e 's/Here\(.*\)String/\1/'


답변

GNU grep은 긍정적 & 부정적 예측 및 예측을 지원할 수 있습니다. 귀하의 경우 명령은 다음과 같습니다.

echo "Here is a string" | grep -o -P '(?<=Here).*(?=string)'

Hereand 가 여러 번 나타나는 경우 string처음 Here부터 마지막 까지 string일치시킬 것인지 개별적으로 일치시킬 것인지 선택할 수 있습니다 . 정규 표현식의 관점에서 욕심 일치 (첫 번째 경우) 또는 욕심없는 일치 (두 번째 경우)라고합니다.

$ echo 'Here is a string, and Here is another string.' | grep -oP '(?<=Here).*(?=string)' # Greedy match
 is a string, and Here is another
$ echo 'Here is a string, and Here is another string.' | grep -oP '(?<=Here).*?(?=string)' # Non-greedy match (Notice the '?' after '*' in .*)
 is a
 is another 


답변

허용 된 답변은 이전 Here또는 이후에 있을 수있는 텍스트를 제거하지 않습니다 String. 이것은 :

sed -e 's/.*Here\(.*\)String.*/\1/'

주된 차이는 첨가이다 .*직전 Here후의 String.


답변

Bash 에서만 문자열을 제거 할 수 있습니다 .

$ foo="Here is a String"
$ foo=${foo##*Here }
$ echo "$foo"
is a String
$ foo=${foo%% String*}
$ echo "$foo"
is a
$

그리고 PCRE 가 포함 된 GNU grep이 있으면 너비가 0 인 어설 션을 사용할 수 있습니다.

$ echo "Here is a String" | grep -Po '(?<=(Here )).*(?= String)'
is a


답변

GNU awk를 통해

$ echo "Here is a string" | awk -v FS="(Here|string)" '{print $2}'
 is a 

grep -P( perl-regexp ) 매개 변수 support \K를 사용하면 이전에 일치 한 문자를 버리는 데 도움이됩니다. 이 경우 이전에 일치 한 문자열이 Here최종 출력에서 ​​삭제되었습니다.

$ echo "Here is a string" | grep -oP 'Here\K.*(?=string)'
 is a
$ echo "Here is a string" | grep -oP 'Here\K(?:(?!string).)*'
 is a 

출력을 원하면 is a아래를 시도해보십시오.

$ echo "Here is a string" | grep -oP 'Here\s*\K.*(?=\s+string)'
is a
$ echo "Here is a string" | grep -oP 'Here\s*\K(?:(?!\s+string).)*'
is a


답변

여러 줄로 된 사건이 ​​많은 긴 파일이 있으면 먼저 번호 줄을 인쇄하는 것이 좋습니다.

cat -n file | sed -n '/Here/,/String/p'


답변

이것은 당신을 위해 일할 수 있습니다 (GNU sed) :

sed '/Here/!d;s//&\n/;s/.*\n//;:a;/String/bb;$!{n;ba};:b;s//\n&/;P;D' file 

이것은 개행 에서 두 개의 마커 (이 경우 HereString) 사이에 각 텍스트 표현을 제시 하고 텍스트 내에 개행을 유지합니다.