繰り返しテキストパターン内の行間のすべての可変数の行をキャプチャし、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
最後の説明でこれを説明してください。
これを捉えるのに適したツールは何ですか?それはfor
andgrep
またはfor
andの組み合わせですか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プログラマーがこれをやりました。