以下のファイルがあります
<g> Good wheatear </g> other parts of line
<g> The farm land is to be sold </g> other parts of line
<g> knock knock </g> other parts of line
私の出力は次のようになりたいです。
<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>
つまり、<g>と</g>タグの間の内容を印刷します(タグを含む)。
私は次のコマンドを試しました。
awk '/<s>/, /<\/s>/' trsTest.txt
しかし、行全体を印刷します。
タグ間でコンテンツを印刷する方法は?
答え1
これにより、次のようawk
になります。
$ awk -v FS="</?g>" '{print $2}' trsTest.txt
Good wheatear
The farm land is to be sold
knock knock
またはラベルを維持したい場合:
$ awk -v FS="</g> " '{print $1 FS}' trsTest.txt
<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>
答え2
単純にGNU grepを使用して、行()の一致部分のみを印刷できます-o
。
grep -o '<g>.*<\/g>' trsTest.txt
*
シェルが次の文字を拡張しないように、パターンは一重引用符の間になければなりません。
最初のコマンドは以下を生成します。
<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>
タグを含めない場合は、次のようにします。
sed 's/.*<g>\(.*\)<\/g>.*/\1/' trsTest.txt
仕組みは次のとおりです。
<g>
開始タグの前のすべての項目と一致します(開始タグを含む)。\(
上記を使ったことを覚えています。\)
<\g>
閉じるタグから行末まで一致します。- それから覚えているものに変えてください。
\1
2番目のコマンドは次のように生成します。
Good wheatear
The farm land is to be sold
knock knock
答え3
XMLの場合は、XMLパーサーを使用できますxmlstarlet
。たとえば、HTMLの場合でも使用できますが、xmlstarlet
構造が壊れる可能性があることを警告する必要があります。
<root/>
入力に適したXMLを作成するために境界要素を追加しました。
<root>
<g> Good wheatear </g> other parts of line
<g> The farm land is to be sold </g> other parts of line
<g> knock knock </g> other parts of line
</root>
次に、</g>
要素と値を選択するコマンドは次のとおりです。
xmlstarlet sel --template --match '//g' --copy-of '.' --nl file.xml
出力
<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>
xmlstarlet
PythonやPythonなどの汎用テキスト解析ツールsed
と比較して、利点はgrep
XML構造を理解しているため、入力ファイルがわずかに変更されていますが、まだ有効なXMLのままである場合は解析xmlstarlet
できます。
答え4
ラベルが常に同じ場合、ラベルを含めるには sed を使用します。
sed 's/\(.*>\).*/\1/' trsTest.txt
出力は次のとおりです
<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>
Quasimodoのコードブロックをより効率的に更新しました。