구분 기호 없이 문자열의 여러 부분을 구문 분석합니다.

구분 기호 없이 문자열의 여러 부분을 구문 분석합니다.
115:wc -l:find . -iname "*test*":find /tmp/ -iname "*test*"

위의 문자열을 구문 분석하고 싶습니다.

내 경우 문자열은 4개의 열( :각 명령에 대한 구분 기호 포함)로 구성되지만 더 길어질 수도 있습니다. 로 시작하고 , ...항상 구분 기호 없이 115계속되는 초기 번호를 포함한 모든 명령을 "풀"하고 싶습니다 .wc -l, -iname "*test*"find /tmp/ -iname "*test*":

내 변수는 $var다음 값을 얻어야 합니다.

var= 115 , var= wc-l , var= find . -iname "*test*" , var= find /tmp/ -iname "*test*"

내 코드:

while read line;
 do
 while [[ $var -ne '0' ]];
   do
    var=$( echo $line | cut -d ':' -f$i )
    i=$( expr $i + 1 )
    echo $var
   done
done <$1

파일에서 행을 읽고 열을 빈 열로 잘라낼 때 두 번째 행을 사용합니다. 분명히 뭔가 잘못된 것 같습니다. 에코가 아무 것도 인쇄하지 않기 때문입니다.

답변1

내 생각에 작동한다고 생각하는 방식으로 작동하도록 수정된 스크립트는 다음과 같습니다.

i=1     
while read line;                        
  do     
  while :; do 
    var=$( echo $line | cut -d ':' -f$i )                                   
    i=$( expr $i + 1 ) 
    [[ "$var" != "" ]] || break
    echo $var
  done     
done <$1

몇 가지 참고사항:

  • i초기화되지 않음
  • var초기화도 없으므로 내부 루프는 한 번도 실행되지 않습니다.
  • 무엇을 테스트해야 할지 잘 모르겠지만 빈 문자열과 비교하는 것이 더 낫다고 [[ $var -ne '0' ]]생각합니다 .$var
  • 따라서 빈 필드(예: 두 개의 연속 콜론)가 있는 경우 스크립트는 거기서 종료됩니다.

동일한 작업을 수행하는 보다 안정적인 방법은 다음과 같습니다.

while read line; do
  num_fields=$(echo $line|awk -F':' '{print NF}')
  for (( i=1; i <= num_fields; i++ )); do
    var=$( echo $line | cut -d ':' -f$i )
    echo $var
  done
done <$1

관련 정보