次のようにファイルを編集する必要があります。
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
スクリプトは「1行」です。
sed -e '/^iface .* inet6/ {' -e ':a' -e 'N;s/.*\n//;/^[[:blank:]]/ba' -e '}'
答え3
私はすでにツールに良い答えを得ていますsed
が、以下を使用してより簡単だと思われる他のものを提案しますpcregrep
。
pcregrep -Mv '^iface.*inet6(.|\n )*' file
正規表現は説明を必要としません。その行から始まるパターンを検索し、^iface.*inet6
文字グループまたはゼロ回以上繰り返される単一のスペースが続く新しい行を検索します。次に、オプションを使用して複数の線形一致がpcregrep
許可されていることを示し、全体を反転します(一致した部分は削除されます)。-M
-v