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

@ajaaskel Кажется, это происходит, когда разделитель не найден во вводе. И это поведение в настоящее время можно изменить, используя параметр --only-delimited.
Самули Пахаоджа

64

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

N=3
STRING="one two three four"

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

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

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]}"

2
В вашем примере действительно ли STRING - это строка? Похоже на массив.
Николас Рауль

@NicolasRaoul Да, вообще-то ты прав. Но я написал, чтобы быть альтернативой.
пнр
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.