インデックスで指定された2つの単語間のテキストを取得するには?

インデックスで指定された2つの単語間のテキストを取得するには?

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です。

関連情報