저는 시그윈을 사용하고 있습니다.
나는 이미 내 손에 있는 라인#을 알고 있다. 스크립트는 지정된 줄 번호 위에 있는 문자열의 첫 번째 발생을 찾고 mono
지정된 줄 번호 아래에 있는 문자열의 첫 번째 발생을 찾아서 /mono
와 사이에 있는 것만 반환해야 합니다. mono
/mono
입력하다:
I have known line # in my hand.
Script should look for the first occurrence of word mono
not monoono
above a specified line #
and look for the
first occurrence of word /mono below the specified line #s
and return ONLY the contents between those 'mono' and /mono
예상 출력
mono
not monoono
above a specified line #
and look for the
first occurrence of word /mono
어떻게 해야 하나요?
답변1
GNU의 컴팩트 버전 sed
:
sed -E 'H;4!d;g;s/.*\<mono\>/mono/;:a;N;s_/mono\>.*_/mono_;Ta' in
설명하다:
H
예약된 공간의 모든 행 수집4!d
네 번째 줄을 제외한 모든 출력 억제- 4번째 줄에서 예약된 공간을 패턴 공간( )으로 이동하고 다음 명령을 사용하여
g
단어 앞의 모든 항목을 제거합니다.mono
s
:a; ... ;Ta
루프를 형성하여 읽을N
때까지 행을 추가합니다./mono
답변2
awk -v L=4 '(NR<L && $0 ~ /\<mono\>/){Pnr=NR;gsub(/^.*\<mono\>/,"mono"); P=$0;next}
(!Nnr && $0 ~ /\/\<mono\>/){Nnr=NR;gsub(/\/\<mono\>.*/,"/mono"); N=$0}
(NR!=FNR && P){print P;P=""}(FNR>Pnr && FNR <Nnr ){print} END{print N}' in in
mono
~ 사이의 결과를 생성합니다 /mono
. 여기에서 특정 4번째 줄 주변에서 처음 발생합니다.
mono
not monoono
above a specified line #
and look for the
first occurrence of word /mono
일치 후 행을 일치시키고 싶지 않은 경우무늬, 이는 가장 짧습니다.
awk -v L=4 '(NR<L && $0 ~ /\<mono\>/){Pnr=NR;next}
(!Nnr && $0 ~ /\/\<mono\>/){Nnr=NR}
(FNR>Pnr && FNR <Nnr)' in in