![패턴이 포함된 줄과 [중복] 앞의 줄을 삭제하세요.](https://linux55.com/image/112061/%ED%8C%A8%ED%84%B4%EC%9D%B4%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%EC%A4%84%EA%B3%BC%20%5B%EC%A4%91%EB%B3%B5%5D%20%EC%95%9E%EC%9D%98%20%EC%A4%84%EC%9D%84%20%EC%82%AD%EC%A0%9C%ED%95%98%EC%84%B8%EC%9A%94..png)
파일에서 패턴이 포함된 두 줄을 삭제하고 싶습니다 aaa bbb ccc
.
패턴이 포함된 줄 aaa bbb ccc
과 그 앞의 줄을 삭제하는 다음 표현식을 사용했습니다.
$ sed -n '/aaa bbb ccc/{s/.*//;x;d;};x;p;${x;p;}' file.txt | sed '/^$/d'
이것은 하나의 파일에 대해 작동합니다. 여러 파일에서는 작동하지 않습니다
$ for i in *.txt; do sed -n '/aaa bbb ccc/{s/.*//;x;d;};x;p;${x;p;}' "$i" | sed '/^$/d'; done
예시 파일:
xxx
yyy
aaa bbb ccc
eee
fff
aaa bbb ccc
ggg
hhh
결과 파일:
xxx
eee
ggg
hhh
답변1
사용하고 있는 것 같습니다 gnu sed
. 이 경우 다음과 같은 작업을 수행할 수 있습니다.
sed -s 'N;/PATTERN/!P;D' ./*.txt
다른 sed
경우에는 파일 목록을 반복해야 합니다.
for file in ./*.txt
do
sed '$!N;/PATTERN/!P;D' "$file"
done
이는 패턴 공간에 항상 두 줄을 유지하고 패턴 공간이 일치하지 않으면 첫 번째 줄을 인쇄하므로 입력은 다음과 같습니다.
some line
PATTERN
PATTERN
more
lines
another line
PATTERN
그것은 인쇄됩니다
more
lines