В оболочке Linux, как я могу обработать каждую строку многострочной строки? - PullRequest
21 голосов
/ 19 февраля 2011

В то время как в оболочке Linux у меня есть строка, которая имеет следующее содержимое:

cat
dog
bird

и я хочу передать каждый элемент в качестве аргумента другой функции. Как я могу это сделать?

Ответы [ 5 ]

48 голосов
/ 19 февраля 2011

Используйте это (это цикл чтения каждой строки из файла file)

cat file | while read -r a; do echo $a; done

, где echo $a это то, что вы хотите сделать с текущей строкой.

ОБНОВЛЕНИЕ: from commentators (спасибо!)

Если у вас нет файла с несколькими строками, но есть переменная с несколькими строками, используйте

echo "$variable" | while read -r a; do echo $a; done

UPDATE2: рекомендуется "read -r" дляотключить обратную интерпретацию (\) символов (проверьте комментарии mtraceur; поддерживается в большинстве оболочек).Это задокументировано в POSIX 1003.1-2008 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html

По умолчанию, если не указана опция -r, <backslash> будет действовать как escape-символ... Поддерживается следующая опция: -r - Не обрабатывать символ <backslash> каким-либо особым образом.Считайте, что каждый является частью строки ввода.

7 голосов
/ 19 февраля 2011

Просто передайте свою строку вашей функции:

function my_function
{
    while test $# -gt 0
    do
        echo "do something with $1"
        shift
    done
}
my_string="cat
dog
bird"
my_function $my_string

дает вам:

do something with cat
do something with dog
do something with bird

И если вы действительно заботитесь о том, чтобы другие пробельные символы использовались в качестве разделителей аргументов, сначала установите IFS:

IFS="
"
my_string="cat and kittens
dog
bird"
my_function $my_string

чтобы получить:

do something with cat and kittens
do something with dog
do something with bird

Не забудьте unset IFS после этого.

6 голосов
/ 19 февраля 2011

если вы используете bash, вам нужно настроить IFS:

$ x="black cat
brown dog
yellow bird"
$ IFS=$'\n'
$ for word in $x; do echo "$word"; done
black cat
brown dog
yellow bird
3 голосов
/ 07 мая 2016

Использование xargs:

В зависимости от того, что вы хотите сделать с каждой строкой, это может быть так просто:

xargs -n1 func < file

или более сложное использование:

cat file | xargs -n1 -I{} func {}
2 голосов
/ 19 февраля 2011

Используйте read с циклом while:

while read line; do
    echo $line;
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...