sed를 사용하여 텍스트 파일의 일부와 다음 줄을 삭제하세요.

sed를 사용하여 텍스트 파일의 일부와 다음 줄을 삭제하세요.

다음과 같이 파일을 편집해야 합니다.

auto wlx00
allow-hotplug wlx00
iface wlx000 inet dhcp
iface wlx000 inet6 auto
  post-up sysctl -w net.ipv6.conf.wlx000.accept_ra=2
auto wlx000

목표는 'iface...inet6'으로 시작하는 줄을 삭제하고 공백으로 시작하는 다음 몇 줄을 삭제하는 것입니다(없음 이상일 수 있음).

iface wlx000 inet6 auto
  post-up sysctl -w net.ipv6.conf.wlx000.accept_ra=2

다음 결과를 얻으려면 나머지를 변경하지 않고 그대로 두십시오.

auto wlx00
allow-hotplug wlx00
iface wlx000 inet dhcp
auto wlx000

나는 다음과 같이 sed를 사용해 보았습니다.

sed -i.old -r -e "/iface\s*\w*\s*inet6.*/,\${d;/^\s.*/d;}" /etc/configfile

그러나 올바른 위치부터 시작하여 끝까지 지워지는 모든 것을 삭제합니다. iface 텍스트를 선택한 후에 공백으로 시작하는 줄만 삭제하고 싶습니다.

답변1

모노라이너 를 다음과 같이 조정해 보세요 sed.

sed  '/iface\s*\w*\s*inet6.*/,/^[^ ]/ {/^[^ i]/!d}' file

첫 번째 패턴부터 공백 문자로 시작하지 않는 첫 번째 줄까지의 범위를 일치시키고 iface공백 또는 "i"(선행)로 시작하는 줄을 제거합니다. i추후 블록이 필요한지 재검토가 필요합니다 .

다음과 같이 작동하는 것 같습니다.

sed -n '/iface\s*\w*\s*inet6.*/ {:L; n; /^[ ]/bL;}; p' file

시도해보고 다시 보고해 주세요.

답변2

표준 스크립트는 sed명시적인 루프를 사용하여 행을 삭제합니다.

/^iface .* inet6/ {
    :again
    N
    s/.*\n//
    /^[[:blank:]]/b again
}

스크립트는 이러한 inet6줄을 찾은 다음 패턴 공간 내부의 해당 줄에 다음 줄을 추가합니다(사이에 새 줄이 포함됨). 그런 다음 첫 번째 개행 문자까지 포함하여 패턴 공간을 제거합니다(이렇게 하면 원래 inet6행이 제거됩니다). 패턴 공간이 공백 문자(공백 또는 탭)로 시작하지 않을 때까지 이 작업을 계속합니다.

시험:

$ cat file
auto wlx00
allow-hotplug wlx00
iface wlx000 inet dhcp
iface wlx000 inet6 auto
  post-up sysctl -w net.ipv6.conf.wlx000.accept_ra=2
auto wlx000
$ sed -f script.sed <file
auto wlx00
allow-hotplug wlx00
iface wlx000 inet dhcp
auto wlx000

수동 데이터 테스트:

$ cat file
something1
something2
iface have a inet6 here
   delete me
   me too
   same here
something3
something4
iface more something inet6
   be gone
   skip this
something5
$ sed -f script.sed <file
something1
something2
something3
something4
something5

스크립트는 "한 줄"입니다.

sed -e '/^iface .* inet6/ {' -e ':a' -e 'N;s/.*\n//;/^[[:blank:]]/ba' -e '}'

답변3

이미 도구에 대한 좋은 답변을 얻었 sed지만 다음을 사용하여 더 쉽다고 생각되는 다른 것을 제안하겠습니다 pcregrep.

pcregrep -Mv '^iface.*inet6(.|\n )*' file

정규식은 설명이 필요하지 않습니다. 해당 줄에서 시작하는 패턴을 검색한 ^iface.*inet6다음 문자 그룹 또는 0회 이상 반복되는 단일 공백이 뒤따르는 새 줄을 검색합니다. 그런 다음 옵션을 사용하여 다중 선형 일치가 pcregrep허용됨 을 표시하고 전체를 반전하면 됩니다 (일치된 부분은 제거됨).-M-v

관련 정보