sedを使用してテキストファイルの一部とそれに続く行を削除する


8

次のようにファイルを編集する必要があります。

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」で始まる行を削除し、スペースで始まる次の数行を削除することです(1つも複数でもかまいません)。

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
@fcm以下の解決策で問題ないかどうかをお知らせください。そうでない場合は、微調整できます


1
@TNTは同じ質問ではありません。これは単一の行を削除するのではなく、行とスペースで始まる次の行を削除することです。
FCM

2
理論的には重複しますが、実際にはありません-ここでは、先頭の空白がある後続の行を介して特定のパターンから照合する方法を示す別の回答を提供することをお勧めします。
ジェフシャラー

1
@rudicは、単純な検索や削除とはほど遠い、優れた精巧な回答を提供しました。
fcm 2018年

回答:


7

あなたのsedワンライナーのこの適応を試してください:

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

最初のパターンからスペース文字で始まらない最初の行までの範囲に一致し、スペースまたは「i」(先頭のiface)で始まる行を削除します。iブロックの後に必要な場合は再考する必要があります。

これはうまくいくように見えます:

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

Plsは再試行を試みます。


6

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(一致した部分は削除されます)。


私は通常pcregrep、はるかに直感的に使用することを好みます。
Rui F Ribeiro
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.