줄번호가 다르고 일치하는 단어 전후의 내용만 반환

줄번호가 다르고 일치하는 단어 전후의 내용만 반환

저는 시그윈을 사용하고 있습니다.

나는 이미 내 손에 있는 라인#을 알고 있다. 스크립트는 지정된 줄 번호 위에 있는 문자열의 첫 번째 발생을 찾고 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단어 앞의 모든 항목을 제거합니다.monos
  • :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

관련 정보