여러 expr2가 포함된 파일에서 expr1과 일치하는 줄을 위의 expr2와 일치하는 다른 줄 앞으로 이동합니다.

여러 expr2가 포함된 파일에서 expr1과 일치하는 줄을 위의 expr2와 일치하는 다른 줄 앞으로 이동합니다.

여러 파일이 포함된 폴더가 있습니다. 각 파일에는 해당 단어가 한 번 이상 나타날 수 implicit있으며 일부 파일에는 여러 줄의 문장이 implicit있을 수 있습니다 .use output뒤쪽에 implicit. 일반적으로 두 줄을 몇 줄로 구분하는지 모르겠습니다. 일부 샘플 파일은 다음과 같습니다.

첫 번째 1.f

...some text...

implicit

...some other text...

첫 번째 2.f

...some text...

implicit
...a few lines...
use output

...some other text...

첫 번째 3.f

...some text...

implicit
...a few lines...
use output

...some other text...

implicit
...a few lines...
use output

...some more text...

첫 번째 4.f

...some text...

implicit

...some other text...

implicit
...few lines...
use output

...some more text...

다음 항목을 모두 이동하고 싶습니다.use output 이상implicit내가 이전에 찾은 것 중 가장 가까운 것 use output.

일반적으로 솔루션은 대소문자를 구분해야 합니다. grep, sed, awk를 기반으로 하는 모든 것이 가능합니다.

개념적으로 솔루션은 다음 논리를 따라야 한다고 생각합니다.

  1. 성냥use output
  2. 줄을 삭제하고 내용을 유지합니다.
  3. 검색 방향을 반대로 하여 첫 번째로 나타나는 항목을 찾습니다.implicit
  4. 일치하면 use output위의 implicit줄을 추가하십시오.
  5. 다시 검색 방향을 반대로 하여 찾기로 돌아갑니다.use output

답변1

범위 문제를 역순으로 살펴보면 단순화됩니다. 마지막으로 우주의 조화를 유지하려면 다시 반전하는 것을 잊지 마세요.

범위 연산자를 사용하면 , 정규식 수는 최대화되지만 가독성은 향상됩니다.

tac file_name |
sed -e '
  /use output/,/implicit/!b
  /use output/{h;d;}
  /implicit/G
'   |   
tac ;

범위 연산자에 의지할 필요가 없습니다. 코드 복잡성을 희생하여 정규식 수를 최소화하십시오.

tac  file |
sed -e '
  /use output/!b
  $q;h;N;s/.*\n//
  :loop
    n
  /implicit/!bloop
  G
'    |
tac  ;

답변2

유틸리티가 존재하지 않는 경우에도 tac에서 해당 작업을 수행할 수 있지만 sed이제 "출력 사용" 줄이 나타날 때까지 인쇄할 수 없습니다. 그 전에 다른 "암시적" 줄이 나타날 수 있다는 것을 알 수 없기 때문입니다.

sed -n '
  /implicit/!bp
  h
  :loop
    ${g;bp;} 
    n
    /implicit/{x;p;bloop;}
    H
  /use output/!bloop
  G;s/\n[^\n]*$//
  :p;p
' file

관련 정보