file.php
次のファイルがあります()。
...
Match user foo
ChrootDirectory /NAS/foo.info/
ForceCommand internal-sftp
AllowTcpForwarding no
GatewayPorts no
X11Forwarding no
Match user bar
ChrootDirectory /NAS/bar.co.uk/
ForceCommand internal-sftp
AllowTcpForwarding no
GatewayPorts no
X11Forwarding no
Match user baz
ChrootDirectory /NAS/baz.com/
ForceCommand internal-sftp
AllowTcpForwarding no
GatewayPorts no
X11Forwarding no
段落の1つを削除するためにbashスクリプトを作成しようとしています。
foo
でスクリプトを実行したいとしましょうfile.php
。
...
Match user bar
ChrootDirectory /NAS/bar.co.uk/
ForceCommand internal-sftp
AllowTcpForwarding no
GatewayPorts no
X11Forwarding no
Match user baz
ChrootDirectory /NAS/baz.com/
ForceCommand internal-sftp
AllowTcpForwarding no
GatewayPorts no
X11Forwarding no
どうすればいいですか?使い方を考えましたが、sed
ライナーひとつだけフィットしていると思いますか?
sed -i 's/foo//g' file.php
段落のほとんどの行は一意ではないため、すべての行に対してこれを行うことはできません!どんなアイデアがありますか?
ベストアンサー1
実際にsed
範囲を選択することもできます。このコマンドは、Match user foo
最初の空白行(含む)間のすべての行を削除します。
$ sed '/Match user foo/,/^\s*$/{d}' file
Match user bar
ChrootDirectory /NAS/bar.co.uk/
ForceCommand internal-sftp
AllowTcpForwarding no
GatewayPorts no
X11Forwarding no
Match user baz
ChrootDirectory /NAS/baz.com/
ForceCommand internal-sftp
AllowTcpForwarding no
GatewayPorts no
X11Forwarding no
しかし、個人的には、先行の-00
空行を削除する利点があるPerlの短絡モード()を使用してこれを行います。
$ perl -00ne 'print unless /Match user foo/' file
Match user bar
ChrootDirectory /NAS/bar.co.uk/
ForceCommand internal-sftp
AllowTcpForwarding no
GatewayPorts no
X11Forwarding no
Match user baz
ChrootDirectory /NAS/baz.com/
ForceCommand internal-sftp
AllowTcpForwarding no
GatewayPorts no
X11Forwarding no
どちらの場合も、-i
ファイルの内部編集を使用できます(これにより、元のファイルのバックアップが作成されますfile.bak
)。
sed -i.bak '/Match user foo/,/^\s*$/{d}' file
または
perl -i.bak -00ne 'print unless /Match user foo/' file