特定の行を一致させ、以下を除くすべての行を印刷します。

特定の行を一致させ、以下を除くすべての行を印刷します。

スレッドに似た指示があります。一致する行と一致する行内のn行目を印刷します。

特定の行を一致させて印刷し、次の行(下の最初の行)を削除してから、特定の行が一致するまで残りの行を印刷する必要があります。

つまり、で</s>始まる行の後に続く行だけを削除するだけです<doc

私のファイル:

<doc>
</s>
<s>
Bla
bla
bla
.
</s>
<s>
Bla
bla
bla
.
</s>
</doc>
<doc>
</s>
...

私が望む出力:

<doc>
<s>
Bla
bla
bla
.
</s>
<s>
Bla
bla
bla
.
</s>
</doc>
<doc>
...

答え1

sed基本的な知識があれば、この質問を理解するのは難しくありません。

sed '/<doc>/{n;/<\/s>/d;}'

がある行の場合は、<doc>印刷して次の行を読み、次の行nに含まれている場合</s>(スラッシュをエスケープする必要があります)として削除しますd

もう少し詳しく説明すると、/expression/{command;command;...;}パターンと一致する行にのみコマンドを実行するという意味なので、他の行はすべてそのまま出力され、その行<doc>に対してはn実行されます。このコマンドは現在の行を印刷して次の行を読み取るので、次の行で次のコマンドが実行されます。ここでも別のコマンド()がd「アドレス」()と一緒に表示されるため、埋め込まれた行だけが削除され、/<\/s>/それ以外の場合は印刷されます。どちらの場合も、スクリプトは次の行を実行し続けます。d</s>

答え2

GNUの使用sed:

sed -z -i 's:<doc>\n</s>:<doc>:g' infile.txt

これは<doc></s>のように<doc>sedのフラグは-i内部置換に使用され、このgフラグが置き換えられます。みんな起こった。-z行は NULL 文字で区切られます。

答え3

タグ付けされたとおりにshell_scriptお勧めします。アッ方法:

awk '/^<doc>/ && getline nl > 0 && nl!~/^<\/s>/{ print $0 RS nl }1' file

出力:

<doc>
<s>
Bla
bla
bla
.
</s>
<s>
Bla
bla
bla
.
</s>
</doc>
<doc>
...

関連情報