![여러 expr2가 포함된 파일에서 expr1과 일치하는 줄을 위의 expr2와 일치하는 다른 줄 앞으로 이동합니다.](https://linux55.com/image/187476/%EC%97%AC%EB%9F%AC%20expr2%EA%B0%80%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20expr1%EA%B3%BC%20%EC%9D%BC%EC%B9%98%ED%95%98%EB%8A%94%20%EC%A4%84%EC%9D%84%20%EC%9C%84%EC%9D%98%20expr2%EC%99%80%20%EC%9D%BC%EC%B9%98%ED%95%98%EB%8A%94%20%EB%8B%A4%EB%A5%B8%20%EC%A4%84%20%EC%95%9E%EC%9C%BC%EB%A1%9C%20%EC%9D%B4%EB%8F%99%ED%95%A9%EB%8B%88%EB%8B%A4..png)
여러 파일이 포함된 폴더가 있습니다. 각 파일에는 해당 단어가 한 번 이상 나타날 수 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를 기반으로 하는 모든 것이 가능합니다.
개념적으로 솔루션은 다음 논리를 따라야 한다고 생각합니다.
- 성냥
use output
- 줄을 삭제하고 내용을 유지합니다.
- 검색 방향을 반대로 하여 첫 번째로 나타나는 항목을 찾습니다.
implicit
- 일치하면
use output
위의implicit
줄을 추가하십시오. - 다시 검색 방향을 반대로 하여 찾기로 돌아갑니다.
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