N-е слово в строковой переменной

87

В Bash я хочу, чтобы N-е слово строки удерживалось переменной.

Например:

STRING="one two three four"
N=3

Результат:

"three"

Какая команда / сценарий Bash могла это сделать?

Николя Рауль
источник

Ответы:

99
echo $STRING | cut -d " " -f $N
Amardeep AC9MF
источник
3
cut завершится ошибкой при запросе несуществующего поля. Вместо возврата "" он вернет саму строку. Пример: echo "aaaa" | cut -f2 результат - "aaaa", а не результат пустой нулевой длины.
ajaaskel
@ajaaskel Кажется, это происходит, когда разделитель не найден во вводе. И это поведение в настоящее время можно изменить, используя параметр --only-delimited.
Самули Пахаоджа
64

Альтернатива

N=3
STRING="one two three four"

arr=($STRING)
echo ${arr[N-1]}
aioobe
источник
3
Использование массивов bash для этого - «лучшее» решение, я ненавижу использовать awk или sed, так как я не вижу, чтобы они были установлены на всех установках, особенно на установке msys.
Сундар
1
Несмотря на то, что эхо «не обязательно», я нашел его полезным для понимания того, как использовать элементы arr. Спасибо
Чен Ли Йонг
1
Если вы установили IFS(внутренний разделитель полей) на ':' или что-то вроде этого вместо пробела, измените его, прежде чем пытаться это сделать.
Noumenon
1
Это должен быть правильный ответ. Использовать для этой цели массивы просто и разумно.
ajaaskel
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
Jkshah
источник
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
3

Ни дорогих вилок, ни труб, ни башизмов:

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

Но остерегайтесь глобусов.

Йенс
источник
2
STRING=(one two three four)
echo "${STRING[n]}"
mnrl
источник
2
В вашем примере действительно ли STRING - это строка? Похоже на массив.
Николас Рауль
@NicolasRaoul Да, вообще-то ты прав. Но я написал, чтобы быть альтернативой.
пнр