여러 파일이 포함된 폴더가 있습니다. 각 파일에는 해당 단어가 한 번 이상 나타날 수 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