ファイルから段落を削除する

ファイルから段落を削除する

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 

おすすめ記事