특정 패턴이 일치한 후 특정 행 수를 삭제하고 싶습니다.
누구든지 이 명령을 사용하여 이 작업을 수행하는 방법을 말해 줄 수 있습니까 sed
?
답변1
sed -ne '/pattern/{n;n;n;n;d;}' -e p
일치하는 행이 삭제됩니다.무늬그다음에는 4줄이 나옵니다.
패턴 자체와 일치하는 줄을 삭제하지 않으려면 다음을 수행하세요.
sed -ne '/pattern/{p;n;n;n;n;d;}' -e p
설명: 현재 줄이 일치하는 경우무늬, [p]는 이를 인쇄한 다음 [n]ext를 가져오고 [n]ext 및 [n]ext를 가져온 다음 [n]ext 및 [d]는 이를 버립니다. [d]iscard로 인해 이 경우 [p]rint 명령이 실행되지 않습니다. 그것은 다른 모든 라인을 실행합니다. -n
자동 인쇄를 비활성화하면(이렇게 하면 거의 모든 것이 인쇄됩니다) -e p
결과 라인이 인쇄되도록 하는 를 사용하는 것을 의미합니다.
예:
$ seq 8 | sed -ne '/2/{p;n;n;n;n;d;}' -e p
1
2
7
8
행 수를 숫자로 지정하려면 다음을 사용하는 것이 더 쉬울 것입니다 awk
.
awk 'n>0 {n--;next}; /pattern/{n=4}; 1'
(이러한 모든 솔루션에서는 건너뛴 줄에서 패턴을 찾지 않습니다.)
답변2
bash를 가정하면 두 단계입니다. 2개의 행을 삭제한다고 가정해 보겠습니다.뒤쪽에"패턴"을 포함하는 줄. 참고: 패턴이 포함된 줄은 삭제되지 않지만 다음 2줄은 삭제됩니다.
N
행을 삭제하려면 grep 매개변수에서 A2
->를 변경하세요.AN
grep -n -A2 pattern inputFile | grep -Ev pattern | sed 's/^\([0-9]*\)-.*/\1/g' > linesToRemove
while read p; do sed -i "${p}d" inputFile; done < linesToRemove
패턴이 포함된 행도 삭제하려면 grep 명령을 다음으로 변경하십시오.
grep -n -A2 pattern inputFile | sed 's/^\([0-9]*\)[-:].*/\1/g' > linesToRemove
설명: 첫 번째 명령은 삭제할 줄의 줄 번호를 찾습니다. 두 번째 명령은 이 줄을 순서대로 삭제합니다. 사용http://explainshell.com/자세히 알아보거나man grep
-i
sed에 옵션이 없다면 다음 내용을 읽어보세요.https://stackoverflow.com/a/15400287/1729501