出力から別の単語を切り取ります。

出力から別の単語を切り取ります。

Linuxシェルでコマンドを実行した結果は、次のようになります。

X and Y are friends

各単語(X、Y、友人)または結果の上位n単語を他のタスクに使用できるように分割する方法はありますか?

答え1

どうですかcut

$ phrase="X and Y are friends"
$ cut -d " " -f 1 <<< $phrase
X
$ cut -d " " -f 2 <<< $phrase
and
$ cut -d " " -f 3 <<< $phrase
Y
$ cut -d " " -f 4 <<< $phrase
are
$ cut -d " " -f 5 <<< $phrase
friends

-d区切り文字(スペース)とフィールド番号(区切り文字で区切られたフィールド)を指定します-f

上記の例では、文字列を変数に配置しましたが、コマンドの出力をパイプできます。

$ mycommand | cut -d " " -f 2
and    

答え2

次のコマンドを使用して、シェルから直接これを実行することもできますread

$ echo "X and Y are friends" | 
  while read a b c d e f
     do echo "a is '$a', b is '$b', c is '$c', d is '$d', e is '$e', f is '$f'"
  done
a is 'X', b is 'and', c is 'Y', d is 'are', e is 'friends', f is ''

デフォルトの区切り文字は空白ですが、変数を変更して別のものに設定できますIFS

$ echo "foo:bar" | while IFS=: read  a b; do echo "a is '$a', b is '$b'"; done
a is 'foo', b is 'bar'

答え3

シェルスクリプトからコマンドの出力をキャプチャするための2つの主な方法があります。コマンドの置き換えそしてread内蔵。

出力を単語に分割する簡単な方法は、シェルに組み込まれている分割機能を使用して出力を配列に配置することです。

words=($(echo "X and Y are friends"))
echo "The ${words[5]} are ${words[1]} and ${words[3]}"

これはksh931、mksh、bash、zshの配列を持つシェルで機能します。他のシェルでは、位置引数を除いて単語リストを保存することはできません。

set -- $(echo "X and Y are friends")
echo "The $5 are $1 and $3"

その結果、出力内のすべての単語はワイルドカードパターンとして扱われ、一致するファイルのリスト(存在する場合)に置き換えられます。 (zshを除いて、これはsh互換モードを除いて明示的に指示された場合にのみ行われます。)たとえば、単語の1つがある場合、*現在のディレクトリにあるファイルのリストに置き換えられます。これを防ぐには、ワイルドカードの一致をオフにします。

set -f
words=($(echo "* and / are punctuation"))
echo "Here's some ${words[5]}: ${words[1]} and ${words[3]}"
set +f

を使用すると、read各変数に個々の単語を割り当てることができます。トリッキーな部分readは標準入力から読み取られるため、通常パイプの右側に使用されますが、ほとんどのシェル(ATT kshとzshを除く)では、パイプの両側がサブシェルで実行されるため、変数割り当てパイプラインの外で失われます。これはread一連の指示の一部として使用できます。

echo "X and Y are friends" | {
  read -r first conjunction second verb complement remainder
  echo "The $complement are $first and $second"
}

あるいは、ksh93、bash、またはzshから入力を渡すこともできます。プロセスの交換

read -r first conjunction second verb complement remainder <(echo "X and Y are friends")
echo "The $complement are $first and $second"

配列に単語を保存するには、read -rA wordsmksh、ksh93、および zsh またはread -ra wordsbash で使用できます。

read -ra words <(echo "X and Y are friends")

等しい

set -f; words=$((echo "X and Y are friends")); set +f

コマンドが行を出力する場合、以前にオン-fになっていたオプションはリセットされません。

¹ Ksh88には配列がありますが、割り当てでは異なる構文を使用します。

答え4

そしてzsh

upToFirst5words=(${$(my-cmd)[1,5]})

デフォルト値がIFSのデフォルト値であると仮定すると、シーケンススペース(スペース、タブ、改行)またはNULに分割されます。

できます:

argv=(${$(my-cmd)[1,5]})

この5つの単語について$1....$2$5

関連情報