2010-04-08 4 views
2

줄을 파싱하고 두 줄 사이에서 찾을 수있는 텍스트를 추출하기 위해 bash에서 작성할 수있는 정규식이란 무엇입니까? (그래서 ex : 1 : | hey | 2 : | boy |가 될 것입니다.) 그리고 그 단어들을 일종의 배열로 유지 하시겠습니까?bash의 줄에있는 두 구분 기호 사이에서 텍스트를 추출하려면 어떻게해야합니까?

+0

는 "전 당신의 예를 들어 당신이

#!/bin/bash declare -a array s="|hey| 2: |boy|" IFS="|" set -- $s array=([email protected]) for((i=1;i<=${#array[@]};i+=2)) do echo ${array[$i]} done 

출력

$ ./shell.sh hey boy 

는 AWK를 사용하여 원하는 것입니다 | 소년 | " 구문 분석 할 라인이나 구문 분석 결과? 후자의 경우 결과를 산출 할 샘플 라인은 무엇입니까? 여러 접근법을 생각해 볼 수는 있지만 입력 내용이 무엇인지에 따라 달라지며 "최상의"접근 방식은 "배열"로 수행 할 작업에 따라 다릅니다. –

+0

예제는 샘플 LINE입니다. 실제로 예제는 새로운 라인에있을 수 있습니다. – syker

+0

내가 배열과 함께하고 싶은 것은 사이에 쉼표라고 말하고 특별한 형식의 순서로 인쇄하고 정렬하는 것뿐입니다. – syker

답변

2

복잡한 정규 표현식이 필요 없습니다. 헤이 | | : 2 : 1 : | ""스플릿 후 모든 둘째 요소는

$ echo s="|hey| 2: |boy|" | awk -F"|" '{for(i=2;i<=NF;i+=2)print $i}' 
hey 
boy 
+0

+1 IFS, set 및()를 잘 사용합니다. 그러나 왼쪽 및 오른쪽 구분 기호가 다른 경우 (예 : '<' and '>') 순서가 의미가 있거나 구분 기호가 여러 문자 (예 : "-") 인 경우이 방법은 작동하지 않습니다. regex 접근법은 좀 더 보편적/융통성있는 IMHO입니다. 더 유연하게 만드는 –

+0

도 어렵지 않습니다. 그것이 OP에 의해 요구 될 때까지, 그것은 그대로 둔다. – ghostdog74

0

를 사용하여 자신의 대답에 sed -e 's,.*|\(.*\)|.*,\1,'

1
$ foundall=$(echo '1: |hey| 2: |boy|' | sed -e 's/[^|]*|\([^|]\+\)|/\1 /g') 
$ echo $foundall 
hey boy 
$ for each in ${foundall} 
> do 
> echo ${each} 
> done 
hey 
boy 
0

, (한 줄에 두 개 이상의 파이프가 가정) 파이프의 마지막 쌍 사이에 무엇을 당신이 출력.

첫 번째 쌍 사이에 무엇이 출력됩니다 :

sed -e 's,[^|]*|\([^|]*\)|.*,\1,' 

가장 바깥 쪽 쌍 사이에 무엇이 의지 출력 (그래서 그들 사이에 표시 파이프 표시됩니다) :

sed -e 's,[^|]*|\(.*\)|.*,\1,' 
0
#!/bin/bash 

_str="ex: 1: |hey| 2: |boy|" 
_re='(\|[^|]*\|)(.*)' # in group 1 collect 1st occurrence of '|stuff|'; 
         # in group 2 collect remainder of line. 

while [[ -n $_str ]];do 
    [[ $_str =~ $_re ]] 
    [[ -n ${BASH_REMATCH[1]} ]] && echo "Next token is '${BASH_REMATCH[1]}'" 
    _str=${BASH_REMATCH[2]} 
done 

수율

Next token is '|hey|' 
Next token is '|boy|' 
관련 문제