문자열을 찾고 문자열의 일부를 아는 문자열을 반환합니다.

문자열을 찾고 문자열의 일부를 아는 문자열을 반환합니다.

예를 들어 문자열이 있습니다.

"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

grepPerl 호환 정규 표현식을 지원 하는 경우 탐욕스럽지 않게 다음 단어 경계와 일치시킬 수 있습니다.

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:]]*문자열과 일치합니다 .IcecreamI


사용 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

관련 정보