0

次のような XML ファイルがあります。

<Group>
    <Name>Awesome Group</Name>
    <Notes />
    <Date>2013-04-04</Date>
    <Expires>False</Expires>
    <Icon>7</Icon>
    <Tags />
</Group>

このコマンド<Notes />との間のすべてを印刷しようとしています:</Icon>

$ sed -n '/\<Notes \/\>/ p' file.xml

開き括弧と閉じ括弧、および閉じ括弧の前のスラッシュをエスケープしていることに注意してください。これは一致を返しません。これは奇妙だと思います。

さらに奇妙なのは、このコマンドが機能することです。

$ sed -n '/<Notes \/>/ p' file.xml

開き括弧と閉じ括弧をエスケープしていないのに、このコマンドが機能するのはなぜですか?

編集

ruakh は、sed にはさまざまな実装があり、開き括弧と閉じ括弧をエスケープする必要がないことを指摘してくれました (sed は正規表現に Perl 構文を使用していると思いました)。Unix と Linux に関する別の投稿も役に立ちました。 -sh-スクリプト

現在、複数行の正規表現の一致に問題があります。これがうまくいかないのはなぜですか?

$ sed -n -r '/^<Notes \/>[\S\s]*?<\/Icon>$/ p' file.xml

-r(拡張モード)の有無にかかわらず、 and の有無にかかわらず、 の^代わりに$使用して、すべて一致しないで試しました.*[\S\s]*

4

2 に答える 2

1

sed は、awk を使用する必要があるその他のテキスト操作に対して、1 行での単純な置換を行うための優れたツールです。GNU awk ソリューションは次のとおりです。

$ gawk -v RS='\0' '{print gensub(/.*(<Notes \/>.*<\/Icon>).*/,"\\1","")}' file
<Notes />
    <Date>2013-04-04</Date>
    <Expires>False</Expires>
    <Icon>7</Icon>

上記は、シンボルが表示された行全体ではなく、要求したシンボルの間に印刷されることに注意してください。

于 2013-04-04T21:14:07.847 に答える