Подтвердить что ты не робот

Bash: Как токенизировать строковую переменную?

Если у меня есть строковая переменная, значение которой "john is 17 years old", как я могу сделать это, используя пробелы как разделитель? Использую ли я awk?

4b9b3361

Ответ 1

Использовать автоматическую токенизацию оболочки без кавычек:

$ string="john is 17 years old"
$ for word in $string; do echo "$word"; done
john
is
17
years
old

Если вы хотите изменить разделитель, вы можете установить переменную $IFS, которая обозначает внутренний разделитель полей. Значение по умолчанию $IFS равно " \t\n" (пробел, табуляция, новая строка).

$ string="john_is_17_years_old"
$ (IFS='_'; for word in $string; do echo "$word"; done)
john
is
17
years
old

(Обратите внимание, что в этом втором примере я добавил скобки вокруг второй строки. Это создает под-оболочку, так что изменение на $IFS не сохраняется. Обычно вы не хотите постоянно изменять $IFS как это может привести к хаосу в ничего не подозревающих командах оболочки.)

Ответ 2

$ string="john is 17 years old"
$ tokens=( $string )
$ echo ${tokens[*]}

Для других разделителей, таких как ';'

$ string="john;is;17;years;old"
$ IFS=';' tokens=( $string )
$ echo ${tokens[*]}

Ответ 3

$ string="john is 17 years old"
$ set -- $string
$ echo $1
john
$ echo $2
is
$ echo $3
17

Ответ 4

вы можете попробовать что-то вроде этого:

#!/bin/bash
n=0
a=/home/file.txt
for i in `cat ${a} | tr ' ' '\n'` ; do
   str=${str},${i}
   let n=$n+1
   var=`echo "var${n}"`
   echo $var is ... ${i}
done

Ответ 5

с расширенным регулярным выражением POSIX:

$ str='a b     c d'
$ echo "$str" | sed -E 's/\W+/\n/g' | hexdump -C
00000000  61 0a 62 0a 63 0a 64 0a                           |a.b.c.d.|
00000008

это как python re.split(r'\W+', str)

\W соответствует несловесному символу,
включая пробел, табуляцию, перевод строки, возврат, [как bash for токенизатора]
но также включая символы, такие как кавычки, скобки, знаки,...

ведущий и завершающий пробел создаст пустую строку.