예를 들어 문자열이 있습니다.
"Icecream123 AirplaneBCD CompanyTL1 ComputerYU1"
내 문자열에 하위 문자열 IceCream이 확실히 포함된다는 것을 알고 있지만 그 뒤에 무엇이 오는지는 모른다고 가정해 보겠습니다.
내 예에서는 123일 수도 있고 다른 값일 수도 있습니다.
grep을 사용하여 문자열에서 "Icecream" 하위 문자열의 존재를 감지할 수 있지만
echo $string | grep -oF 'Icecream';
인쇄됩니다
Icecream
전체 하위 문자열을 인쇄하는 명령을 사용하고 싶습니다. 제 예에서는 다음과 같습니다.
Icecream123
물론 따라오는 아이스크림은 랜덤이고 사전에 알 수 없기 때문에 이렇게만 할 수는 없다.
$SUBSTRING=$(echo $string | grep -oF 'Icecream')
$SUBSTRINGTRAIL=123
echo $SUBSTRING$SUBSTRINGTRAIL
답변1
grep
Perl 호환 정규 표현식을 지원 하는 경우 탐욕스럽지 않게 다음 단어 경계와 일치시킬 수 있습니다.
echo "$string" | grep -oP 'Icecream.*?\b'
그렇지 않으면 공백이 아닌 문자의 가장 긴 시퀀스와 일치합니다.
echo "$string" | grep -o 'Icecream[^[:blank:]]*'
또는 모든 것을 셸에 유지하고 공백으로 시작하는 가장 긴 후행 문자 시퀀스를 제거합니다.
echo "${string%% *}"
답변2
bash를 태그했기 때문에:
[[ $string =~ (Icecream[^ ]*) ]] && result=${BASH_REMATCH[1]}
더 일반적으로는 다음의 검색어에 대해 설명합니다 $search
.
[[ $string =~ ($search[^ ]*) ]] && result=${BASH_REMATCH[1]}
...또는 매개변수 확장을 사용하세요.
# remove any leading text up to -and through- the search text:
x=${string##*$search}
# remove any trailing space onwards
result=$search${x%% *}
답변3
grep
알고 있는 것을 활용하세요 -o
:
$ printf '%s\n' "$string" | grep -o '\<Icecream[^[:blank:]]*'
Icecream123
이 패턴은 앞에 단어가 아닌 문자나 줄의 시작 부분이 있고 그 뒤에 0개 이상의 공백이 아닌 문자(공백이나 탭이 아님)가 오는 \<Icecream[^[:blank:]]*
문자열과 일치합니다 .Icecream
I
사용 awk
:
$ printf '%s\n' "$string" | awk -v RS=' ' '/^Icecream/'
Icecream123
프로그램 awk
은 문자열을 공백으로 구분된 레코드로 나누고 각 레코드를 테스트합니다. string 으로 시작하는 것은 무엇이든 인쇄합니다 Icecream
.
mawk
또는 GNU를 사용하면 awk
다음을 사용할 수도 있습니다.
printf '%s\n' "$string" | awk -v RS='[[:blank:]]' '/^Icecream/'
RS
여러 문자가 포함되어 있으면 정규식으로 해석되기 때문입니다 .
및 다음 sed
과 유사한 방식으로 grep
:
$ printf '%s\n' "$string" | sed 's/.*\(\<Icecream[^[:blank:]]*\).*/\1/'
Icecream123
사용 /bin/sh
:
set -- Icecream123 AirplaneBCD CompanyTL1 ComputerYU1
for string; do
case $string in
Icecream*)
printf '%s\n' "$string"
break
esac
done
Perl(의 도움을 받아 tr
):
$ printf '%s\n' "$string" | tr ' ' '\n' | perl -ne '/Icecream\S*/ && print'
Icecream123
그렇지 않으면
$ printf '%s\n' "$string" | perl -ne '/(Icecream\S*)/ && print $1, "\n"'
Icecream123
답변4
특히 grep 버전이 perl 정규식을 지원하지 않는다고 말했기 때문에 좀 더 간단할 수도 있습니다.
$ echo $string | tr ' ' '\n' | grep 'Icecream' Icecream123
tr
모든 공백을 개행 문자로 바꾸어 문자열을 여러 줄로 나눕니다. 그러면 grep
사용하기 쉽습니다.
또한 다음과 같이 작성하여 찾고 있는 단어 뒤에 오는 내용만 얻을 수도 있습니다.
$ echo $string | tr ' ' '\n' | sed -n 's/Icecream//p' 123