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

后端 未结 6 570
情深已故
情深已故 2021-01-31 17:24

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

cat
dog
bird

and I want to pass each item as an argument to another fu

相关标签:
6条回答
  • 2021-01-31 18:03

    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
    
    0 讨论(0)
  • 2021-01-31 18:06

    Use read with a while loop:

    while read line; do
        echo $line;
    done
    
    0 讨论(0)
  • 2021-01-31 18:14

    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 {}
    
    0 讨论(0)
  • 2021-01-31 18:17

    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.

    0 讨论(0)
  • 2021-01-31 18:17

    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 讨论(0)
  • 2021-01-31 18:21

    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.

    0 讨论(0)
提交回复
热议问题