2012-06-26 3 views
0

여러 줄을 포함하는 변수에서 두 문자열 사이의 내용을 가져 왔습니다. 각 줄이 숫자로 시작하는지 확인하고 싶은 경우 카운터를 증가시키고 해당 숫자 다음에 그리고 다음 숫자 앞에 문자열이 필요합니다. 그래서셸에서 변수를 한 줄씩 읽는 동안 줄을 확인하는 방법

1. Create 
    create a volume. 
2. destroy 
     destroy a volume. 

과 : 내가 들어있는 변수 $ 선을 말한다. var1에있는 10 개의 연산, var2에있는 숫자 다음에 문자열, var3에있는 destroy (계속) 등의 작업을 계산하고 싶습니다. 쉘 스크립트에서 처리하는 방법. 코드 추가 사전

에서 감사 :

$ 선 내가 필요한 작업을 할 필요가있는 설명과 속성 사이의 내용이 포함
line=$(sed -n '/Description/,/properties/p' readme.txt) 
echo "$line" 



sed -n -e '/^[0-9]/{s/\([0-9]*\).*/\1/;h;n;s/^ *//;H;x;s/\n/ /p;d;}' <<< "$line" 
operations=0 
while read -r n str ; 
do 
    let operations+=1 
    printf '%d, %d, %s\n' "$operations" "$n" "$str" 
done < <(sed -n -e '/^[0-9]/{s/\([0-9]*\).*/\1/;h;n;s/^ *//;H;x;s/\n/ /;p;d;}' <<<"$line") 


printf "Opertions = %d\n' "$operations" 
done 

.

+0

항상 번호가 매겨진 줄 사이에 정확히 한 줄입니까? – Sorpigal

답변

0

만약 당신이 올바르게 이해한다면 다음과 같은 것을 원할 것입니다. (약간의 경우 수정이 필요하다면 아래의 몇 가지 사항에 대해 bash을 사용하고 있다고 가정합니다).

먼저 글 머리 기호 번호와 문자열을 다음 줄에 가져옵니다. 약간 sed가됩니다.

sed -n -e '/^[0-9]/{s/\([0-9]*\).*/\1/;h;n;s/^ *//;H;x;s/\n/ /p;d;}' <<<"$line" 

다음으로 줄을 읽고, 줄을 세어 변수에 저장하면됩니다. 각 루프 n 동안

operations=0 
while read -r n str ; do 
    let operations+=1 
    printf '%d, %d, %s\n' "$operations" "$n" "$str" 
done < <(sed -n -e '/^[0-9]/{s/\([0-9]*\).*/\1/;h;n;s/^ *//;H;x;s/\n/ /;p;d;}' <<<"$line") 

printf 'Opertions = %d\n' "$operations" 

총알의 수이고 str 다음 행의 문자열이다.

+0

감사합니다 Sorpigal하지만 던지는 오류 : txthtml1 : 17 번째 줄 : 예기치 않은 토큰 근처에서 구문 오류가 발생했습니다. user1389673

+0

체크를 할 수있는 코드를 추가했습니다 – user1389673

+0

@ user1389673 : 쉘이 bash라고 가정했는데 이것은 그렇지 않다는 것을 의미합니다 (또는 매우 오래된 버전입니다). 이 문제를 해결하려면'sed' 명령을 별도의 줄에서 실행하고 출력을 파일로 보낸 다음'<()'구문을 파일 이름으로 바꿉니다. – Sorpigal

관련 문제