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

Как разбить строку на слова, разделенные одним или несколькими пробелами в bash?

Я понимаю, как это сделать в python, только с

line = db_file.readline()
ll=string.split(line)

но как я могу сделать то же самое в bash? действительно ли можно сделать это так просто?

4b9b3361

Ответ 1

s='foo bar baz'
a=( $s )
echo ${a[0]}
echo ${a[1]}
...

Ответ 2

Это зависит от того, что вы подразумеваете под расколом. Если вы хотите перебирать слова в строке, которая находится в переменной, вы можете просто перебирать ее. Например, допустим, что переменная line равна this is a line. Затем вы можете сделать это:

for word in $line; do echo $word; done

Это напечатает:

this
is
a
line

for .. in $var разделяет $var, используя значения в $IFS, значение по умолчанию которого означает "разделенные пробелы и новые строки".

Если вы хотите читать строки от пользователя или файла, вы можете сделать что-то вроде:

cat $filename | while read line
do
    echo "Processing new line" >/dev/tty
    for word in $line
    do
        echo $word
    done
done

Для чего-то еще, вам нужно быть более явным и более подробно определить свой вопрос.

Примечание. Отредактировано для удаления башизма, но я все еще сохранял cat $filename | ..., потому что мне больше нравится перенаправление.

Ответ 3

Если вам требуется конкретное слово из строки, awk может оказаться полезным, например

$ echo $LINE | awk '{print $2}'

Печатает второе разделенное пробел слово в $LINE. Вы также можете разделить на другие символы, например.

$ echo "5:6:7" | awk -F: '{print $2}'
6

Ответ 4

echo $line | tr " " "\n"

дает результат, аналогичный результатам большинства ответов выше; без использования петель.


В вашем случае вы также упомянете ll=<...output...>,
так, (учитывая, что я не знаю много python и предполагаю, что вам нужно назначить вывод переменной),

ll=`echo $line | tr " " "\n"`

должно быть достаточно (вспомните echo "$ll" вместо echo $ll)

Ответ 5

$ line="these are words"
$ ll=($line)
$ declare -p ll  # dump the array
declare -a ll='([0]="these" [1]="are" [2]="words")'
$ for w in ${ll[@]}; do echo $w; done
these
are
words

Ответ 6

сделайте это

while read -r line
do
  set -- $line
  echo "$1 $2"
done <"file"

$1, $2 и т.д. будут вашим 1-м и 2-м разделенными полями. используйте [email protected], чтобы получить все значения. Используйте $#, чтобы получить длину "полей".

Ответ 7

Проще,

echo $line | sed 's/\s/\n/g'

\ s → пробельный символ (пробел, табуляция, NL, FF, VT, CR). Во многих системы также действительны [: пробел:]

\n → новая строка

Ответ 8

Параметр -a read позволит вам разбить строку, считанную символами, содержащимися в $IFS.

Ответ 9

Если у вас уже есть строка текста в переменной $LINE, вы должны иметь возможность сказать

for L in $LINE; do
   echo $L;
done