두 일치 문자열 중 하나가 일치하는 경우 행을 추출하는 방법은 무엇입니까?

두 일치 문자열 중 하나가 일치하는 경우 행을 추출하는 방법은 무엇입니까?

아래와 같이 국가 이름에 대한 정보가 포함된 여러 줄의 파일이 있습니다.

$cat country.txt

max_china_clean_foo
man_india_raw_bar
max_us_clean_bax
max_uk_raw_bar
max_canada_raw_foo
max_au_clean_bar

이 파일에서 국가 이름을 추출하고 싶습니다. 현재 for 루프에서 국가 이름을 추출하기 위해 아래 코드를 사용하고 있습니다.

val=${val#*_}
val=${val%_clean*}
echo $val

하지만 생성된 출력에는 국가 china, us이름 만 있으므로 au아래와 같이 나머지 국가를 추출하려면 약간 수정하여 유사한 코드를 반복해야 합니다.

val=${val#*_}
val=${val%_raw*}
echo $val

clean나는 이것이 그것을 코딩하는 명확한 방법이 아니므로 raw또는 문자열을 포함하는 모든 줄에서 국가 이름을 추출하는 데 도움이 필요하다는 것을 알고 있습니다.

awk 또는 sed를 사용하여 두 개의 일치하는 키가 있는 모든 국가 이름을 추출하는 방법이 있습니까? 내 출력은 다음과 같아야합니다

china
india
us
uk
canada
au

답변1

텍스트를 처리하기 위해 쉘 루프를 사용하지 않습니다.

여기에서 다음을 수행할 수 있습니다.

cut -d _ -f 2 < country.txt

또는 입력에 _문자가 없는 줄이 포함될 수 있는 경우:

awk -F _ 'NF >= 2 {print $2}' < country.txt

국가 이름에 문자가 포함될 수 있고 해당 행의 첫 번째 발생 사이 또는 이후의 부분을 _반환하려는 경우 다음을 수행할 수 있습니다.__raw_clean

perl -ne 'print $1 if s/^[^_]*_(.*?)_(clean|raw)/' < country.txt

또는 GNU를 사용하십시오 grep:

grep -Po '^[^_]*_\K.*?(?=_clean|_raw)' < country.txt

-P(PCRE 지원으로 구축된 경우 grep) 정규식은 Perl 호환 정규식입니다. 이러한 정규식에서는 \K일치하는 문자열의 시작 부분이 재설정되고 (?=...)미리보기 연산자입니다. 즉, ...일치하는 부분에 포함된 나머지 문자열에서 일치하는 항목을 찾습니다. 출력을 일치하는 부분으로 -o만드십시오 . 따라서 여기서는 위와 일치하는 항목을 인쇄합니다. 즉, 탐욕스럽지 않은 등가물입니다 . 즉, 가능한 한 짧은 0개 이상의 문자 시퀀스(이 경우 0개 이상의 밑줄 시퀀스 뒤에 오는)입니다. ( )는 ( ) 줄을 시작하고 그 뒤에 밑줄이 오고 그 뒤에는 또는 가 오는 것으로 간주됩니다 .grep.*?.*[^_]*^_raw_clean

이를 사용하여 pcregrep다음과 같이 작성할 수도 있습니다.

pcregrep -o1 '^[^_]*_(.*?)_(clean|raw)'

그것을 사용하면 -o1첫 번째 부분과 일치하는 부분이 인쇄됩니다 (...).

답변2

이것은 awk 스타일 방식입니다

awk -F'_' '/clean|raw/{ print $2}'

관련 정보