开发者

In a Linux shell how can I process each line of a multiline string?

While in a Linux shell I have a string which has the following contents:

cat
开发者_JS百科dog
bird

I want to pass each item as an argument to another function. How can I do this?


Use this (it is loop of reading each line from file file)

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

where the echo $a is whatever you want to do with current line.

UPDATE: from commentators (thanks!)

If you have no file with multiple lines, but have a variable with multiple lines, use

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

UPDATE2: "read -r" is recommended to disable backslashed (\) chars interpretation (check mtraceur comments; supported in most shells). It is documented in POSIX 1003.1-2008 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html

By default, unless the -r option is specified, <backslash> shall act as an escape character. .. The following option is supported: -r - Do not treat a <backslash> character in any special way. Consider each to be part of the input line.


Just pass your string to your function:

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

gives you:

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

And if you really care about other whitespaces being taken as argument separators, first set your IFS:

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

to get:

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

Do not forget to unset IFS after that.


if you use bash, setting IFS is all you need:

$ x="black cat
brown dog
yellow bird"
$ IFS=$'\n'
$ for word in $x; do echo "$word"; done
black cat
brown dog
yellow bird


Use read with a while loop:

while read line; do
    echo $line;
done


Use xargs:

Depending on what you want to do with each line, it could be as simple as:

xargs -n1 func < file

or more complicated using:

cat file | xargs -n1 -I{} func {}


Do like this:

multrs="some multiple line string ...
...
..."

while read -r line; do
    echo $line;
done <<< "$mulstrs"

Variable $mulstrs must be enclosed in double quotes, otherwise spaces or carriage returns will interfere with the calculation.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜