문자열의 두 단어 사이에있는 모든 것을 포함하는 문자열을 출력하려고합니다.
입력:
"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)'
Here
and 가 여러 번 나타나는 경우 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
이것은 개행 에서 두 개의 마커 (이 경우 Here
및 String
) 사이에 각 텍스트 표현을 제시 하고 텍스트 내에 개행을 유지합니다.