
スレッドに似た指示があります。一致する行と一致する行内の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>
...