2016-10-14 10 views
1

私は投稿grep all characters including newlineを読みましたが、XMLで作業していないので、私のLinuxコマンドとは少し異なります。文字列間の一致Linux Grepコマンド

私は、次のデータを持っている:

このコマンド cat file.txt | grep -o '<tag.*tag>\|^--.*'を使用
Example line 0</span> 
<tag>Example line 1</tag> 
<span>Example line 1.5</span> 
<tag> 
Example line 2 
</tag> 
Example line 3 
<span>Example line 4</span> 

私が手:

<tag>Example line 1</tag> 

しかし、私は出力になりたい:

<tag>Example line 1</tag> 
<tag>Example line 2</tag> 

どのようにすることができます改行を含む文字列間の何かにマッチしますか?

注:<tagtag>を文字列として使用する必要があります。これは、他のファイルに複数のタグとテキストが行間に含まれる可能性があるためです。サンプルデータを更新して表示します。

答えて

1

これはレコードセパレータとして</tag>を使用してgnu-awkで簡単に行われます

awk -v RS='</tag>' 'RT {gsub(/\n/, ""); print $0 RT}' file 

<tag>Example line 1</tag> 
<tag>Example line 2</tag> 
+0

それらの間に入るには ' 'を使う必要があります。サンプルデータの更新申し訳ありません: -/ – DomainsFeatured

+0

okこれを試してください: 'awk -v RS = '' 'RT {gsub(/.*? | \ n /、" ");印刷 "" $ 0 RT} 'ファイル' – anubhava

+1

こんにちはアンバハバ、これは動作します!私はこれを踏まえて別の質問をするつもりです。ありがとうございました:-) – DomainsFeatured

0

このテストファイル考えてみましょう。これはあなたが望む出力を生成

$ cat file2 
Example line 0</span> 
<tag>Example line 1</tag> 
<span>Example line 1.5</span> 
<tag> 
Example line 2 
</tag> 
Example line 3 
<span>Example line 4</span> 

を(GNUがsedは必要):

$ sed -z 's|\n||g; s|</tag>|&\n|g; s|[^\n]*<tag>|<tag>|; s|\n[^\n]*<tag>|\n<tag>|g; s|\n[^\n]*$|\n|' file2 
<tag>Example line 1</tag> 
<tag>Example line 2</tag> 

制限:注非で処理するXMLのようなテキストこと特殊なツールはかなり壊れやすいすることができます。

+0

ねえジョンは、申し訳ありませんが、データが他のタグを持っています。私の例はあまりにもミニマリストすぎた。私はちょっと更新しました。 – DomainsFeatured

+0

@DomainsFeatured修正された入力ファイルを処理するコードの更新された回答を参照してください。 – John1024