文字列変数のN番目の単語


87

Bashでは、変数が保持する文字列のN番目の単語を取得したいと思います。

例えば:

STRING="one two three four"
N=3

結果:

"three"

どのBashコマンド/スクリプトがこれを行うことができますか?

回答:


99
echo $STRING | cut -d " " -f $N

3
存在しないフィールドを要求すると、cutは失敗します。「」を返す代わりに、文字列自体を返します。例:echo "aaaa" | cut -f2の結果は「aaaa」であり、空白のゼロ長の結果ではありません。
ajaaskel 2018

@ajaaskelこれは、入力に区切り文字が見つからない場合に発生するようです。そして、その振る舞いは、現在、オプション--only-delimitedを使用して変更できます。
SamuliPahaoja20年

64

代替案

N=3
STRING="one two three four"

arr=($STRING)
echo ${arr[N-1]}

3
これにbashアレイを使用するのが「最良の」ソリューションです。すべてのセットアップ、特にmsysセットアップにインストールされているとは限らないため、awkまたはsedを使用するのは嫌です。
Sundar 2015年

1
エコーは「必要ありません」が、arr要素の使い方を理解するのに役立つことがわかりました。ありがとう
Chen Li Yong

1
IFS(内部フィールド区切り文字)を空白ではなく「:」などに設定した場合は、これを試す前に元に戻してください。
ヌーメノン2016年

1
これは正しい答えです。この目的で配列を使用することは、単純で賢い方法です。
ajaaskel 2018

32

使用する awk

echo $STRING | awk -v N=$N '{print $N}'

テスト

% N=3
% STRING="one two three four"
% echo $STRING | awk -v N=$N '{print $N}'
three

9

いくつかのステートメントを含むファイル:

cat test.txt

結果:

This is the 1st Statement
This is the 2nd Statement
This is the 3rd Statement
This is the 4th Statement
This is the 5th Statement

したがって、このステートメントタイプの4番目の単語を出力するには:

cat test.txt |awk '{print $4}'

出力:

1st
2nd
3rd
4th
5th

2
OPは、文字列がファイルではなく変数にあると言っています。
codeforester 2018

3

高価なフォーク、パイプ、バシズムはありません:

$ set -- $STRING
$ eval echo \${$N}
three

ただし、グロビングには注意してください。


2
STRING=(one two three four)
echo "${STRING[n]}"

2
あなたの例では、STRINGは本当に文字列ですか?配列のように見えます。
ニコラスラウル2013年

@NicolasRaoulはい、実際にはその通りです。しかし、私は代わりになるように書いています。
mnrl 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.