Если у меня есть строковая переменная, значение которой "john is 17 years old"
, как я могу сделать это, используя пробелы как разделитель? Использую ли я awk
?
Bash: Как токенизировать строковую переменную?
Ответ 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
токенизатора]
но также включая символы, такие как кавычки, скобки, знаки,...
ведущий и завершающий пробел создаст пустую строку.