URL이 있습니다:
www.google.com/word/word1/word_2/word3/word4
_
awk를 사용하여 특수 문자가 포함된 단어 만 인쇄하고 싶습니다 . 때로는 폴더 계층 구조가 변경될 수 있습니다.
www.google.com/word/word1/word2/word3/word_4
저는 이것을 사용하고 있는데 가끔 폴더가 위에 있을 때가 있습니다 $6
.
folder=$(echo "$url" | awk -F/ '{print $6}')
/
문자 사이에 폴더 이름을 인쇄 해야 합니다 .
답변1
이와 같은 것이 작동합니다. 아마도 더 효율적인 방법이 있을 것입니다.
echo 'www.google.com/word/word1/word2/word3/word_4' | awk -F'/' '{for(i=2;i<=NF;i++){if($i~/_/){print $i}}}'
word_4
모든 필드를 반복하고 단어에 밑줄이 포함되어 있는지 확인하면 해당 단어를 인쇄합니다. 2부터 도메인 이름은 변경되지 않은 것으로 가정합니다.
비반복적 접근 방식에 대한 아이디어:
$ echo 'www.google.com/word/word1/word_2/word3/word4' | awk '{print gensub(/^.*\/([^/]+_[^/]*).*/,"\\1","1")}'
word_2
awk가 필요하지 않은 경우 더 우아한 솔루션은 다음과 같습니다.
$ echo 'www.google.com/word/word1/word_2/word3/word4' | grep -oE '[^/]+_[^/]*'
word_2
답변2
간단한 해결책은 다음과 같습니다.
% echo 'www.google.com/word/word1/word_2/word3/word4' | tr -s '/' '\n' |grep _
word_2
즉, 슬래시를 개행으로 변경한 다음 밑줄이 포함된 결과 줄을 인쇄합니다.
슬래시 이외의 다른 문자를 단어 구분 기호로 간주해야 하는 경우 첫 번째 인용 문자열에 포함시키세요. 또는 반대 방법으로 단어의 일부가 될 수 있는 모든 항목을 나열합니다.
% echo 'www.google.com/word/word1/word_2/word3/word4' | tr -sc 'a-zA-Z_0-9' '\n' |grep _
word_2
답변3
zsh
대신 을 사용하면 다음 을 포함하는 분리된 단어를 bash
추출할 수 있습니다 ./
_
words=( ${(M)${(s[/])url}:#*_*} )
이는 해당 단어에 포함된 바이트 값에 관계없이 작동하며 프로세스를 포크하거나 외부 유틸리티를 실행하는 것과 관련이 없습니다.
${(s[/])url}
s
변수를 /
패턴과 일치하는 배열의 ${(M)array:#pattern}
요소 로 .expands로 분할합니다.M
에서도 할 수 있지만 bash
더 번거롭습니다.
words=()
IFS=/; set -o noglob
for word in $url; do
if [[ $word = *_* ]]; then
words+=( "$word" )
done
done
awk
perl
일부 텍스트 스트림/파일에서 한 줄에 하나씩 긴 URL 목록이 있는 경우 /가 더 적합합니다.
그리고 perl
:
that-stream | perl -F/ -lae 'print for grep /_/, @F'