テキストファイル内の事前定義されたタグ間の行の一部を印刷します。

テキストファイル内の事前定義されたタグ間の行の一部を印刷します。

以下のファイルがあります

<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>

xmlstarletPythonやPythonなどの汎用テキスト解析ツールsedと比較して、利点はgrepXML構造を理解しているため、入力ファイルがわずかに変更されていますが、まだ有効な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のコードブロックをより効率的に更新しました。

関連情報