繰り返しパターンのすべての行をキャプチャし、子の結果に対していくつかのアクションを実行する方法

繰り返しパターンのすべての行をキャプチャし、子の結果に対していくつかのアクションを実行する方法

繰り返しテキストパターン内の行間のすべての可変数の行をキャプチャし、bashでその行に対してアクションを実行する可能性を探しています。

テキスト例:

Total:
text1
text2
Total:
text3
Total:
Text1
Text4
Text5

私の目標は、基本的には一致に対してforループを実行し、そのTotal:項目に対してアクションを実行することです。これは常に後続のサブテキストの最初の部分です。

高級言語と同様に: for (cat filename = every "Total:" do <something> end

今私にとって興味深いのは、基本的にforループを設定する方法です。

<something>したい部分では、jqそしてawk

結果は、基本的に次の3つの一致するサンプルテキストに基づいています。 1.

Total:
text1
text2
Total:
text3
Total:
Text1
Text4
Text5

最後の説明でこれを説明してください。

これを捉えるのに適したツールは何ですか?それはforandgrepまたはforandの組み合わせですかawk

私はちょうどGNUツールを使用したいと思います。したがって、perl他の外部ツールはありません。

ありがとうございます。

ベストアンサー1

適切なツール©はありませんが、以下を含む適切なツールがたくさんありますawkしかし、殻ではありません。)。古典的な方法は、文字列を見つけるときに値を変更する変数を使用することです。たとえば、各部分を一緒に接続したいとします。

$ awk '
{ 
 if($0 == "Total:"){
   c++
 } 
 else{
   lines[c] = lines[c] ? lines[c]","$0 : $0
 }
}
END{
  for (c in lines){
    printf "Text for total %d:\n%s\n",c,lines[c]
  }
}' file 
Text for total 1:
text1,text2
Text for total 2:
text3
Text for total 3:
Text1,Text4,Text5

または、単に分離したい場合は、レコード区切り文字を次のように設定してTotal:次のように実行できます(GNU awkを使用)。

$ gawk -v RS="Total:" 'NR>1{ print "Section "(NR-1),$0}' file
Section 1 
text1
text2

Section 2 
text3

Section 3 
Text1
Text4
Text5

(より良い方法は、次のようなRS="(^|\n)Total:\n"ものを使用することです。エドモートンの答え)

それは実際にあなたが何をしたいのかによって異なります。 Awkは想像力によってのみ制限されるプログラミング言語です*

*このプログラムの主な目的は、テキストを解析することです。 3Dシューティングゲームを実装しようとすると、あまり面白くないでしょうawkクレイジーマゾヒスト勤勉なawkプログラマーがこれをやりました。

おすすめ記事