아래와 같이 국가 이름에 대한 정보가 포함된 여러 줄의 파일이 있습니다.
$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}'