awkを使用すると、次のようにインデックス付きの単語を印刷できます。
$ echo "The quick brown fox jumps over the lazy dog" | awk '{print $3, $7}'
brown the
しかし、指定された単語 "brown"と "the"の間にあるテキストもインポートしたいと思います。だから私は出力が次のようになりたいと思います。
brown fox jumps over the
特にawkを使用する必要はありませんが、単語の索引付けとトークン化は、awkを使用する残りのシェルスクリプトと一貫性を保つためにawkと一致する必要があります。
最初のインデックスから最後のインデックスまで単語を印刷することを検討しましたが、単語間のスペースは保持されません。
複雑ですが、より正確に表現するために、インデックスで指定された特定の単語の先頭から始まり、別のインデックスで指定された別の単語の終わりで終わるテキストを取得したいと思います。これをどのように達成できますか(好ましくはbashループなし)。
答え1
Passをgawk
使用すると、このsplit()
関数を使用してフィールドとその区切り文字を決定できます。
$ echo "The quick brown fox jumps over the lazy dog" | awk '{ split($0, a, "\\s+", s); for (i = 3; i <= 7 && i <= length(a); i++) printf "%s%s", a[i], (i < 7 ? s[i] : "\n") }'
brown fox jumps over the
答え2
そしてperl
$ echo "The quick brown fox jumps over the lazy dog" | perl -F'(\h+)' -lane 'print @F[4..12]'
brown fox jumps over the
-F'(\h+)'
スペース/タブに分割、区切り記号も保存print @F[4..12]
必要なインデックスを印刷します。perl
配列インデックスは次から始まり、区切り0
文字も考慮する必要があります。単純なルールは、1を減算して2を掛けることです。したがって、(3-1)* 2 = 4、(7-1)* 2 = 12です。