使用bash中的分隔符为变量分配行

时间:2017-03-20 14:38:33

标签: bash grep ifs

我有一个从grep输出构建的文件,它看起来像这样:

http://google.fr
Pierre google
http://test.fr
--
http://yahoo.com
Jean Yahoo
http://test.fr
--

我做了一个分隔符' - '每3行。我想将每一行分配给一个变量,例如:

url= "http://google.fr"
name= "Pierre Google"
web= "http://test.fr"

所以我使用IFS =制作了bash脚本 - 我尝试使用-d选项进行回显,但我不知道如何将这3行分配给每个块的变量。

感谢您的帮助

3 个答案:

答案 0 :(得分:4)

通过一些错误处理,这可能看起来像:

while read -r url && read -r name && read -r web; do
  echo "Read url of $url, name of $name, and web of $web"
  read -r sep || { true; break; } # nothing to read: exit loop w/ successful $?
  if [[ $sep != -- ]]; then
    printf 'Expected separator, but saw: %q\n' "$sep" >&2
    false; break # "--" not seen where expected; exit loop w/ $? indicating failure
  fi
done <in.txt

请参阅BashFAQ #1

(顺便说一句 - 如果你不想要删除前导和尾随空格,我建议用IFS=清除IFS - 作为read的范围,如同while IFS= read -r url && IFS= read -r name && IFS= read -r web 1}},或脚本的全局,如果没有其他任何事情发生在副作用不被要求的地方)。

答案 1 :(得分:1)

您可以将文件预处理为更典型的格式,以使用IFS通过awksed等实用程序将字段(或变量)分隔开来:

while IFS="|" read -r url name web; do
    echo "$url" "$name" "$web"
done  < <(awk 'BEGIN{RS="--\n"; FS="\n"; OFS="|"} {print $1,$2,$3}' file)

保留每行的前导和尾随空格。

如果要删除前导和尾随空格,请删除IFS="|"OFS="|"部分,以便Bash删除这些行:

while read -r url name web; do
    echo "$url" "$name" "$web"
done  < <(awk 'BEGIN{RS="--\n"; FS="\n"} {print $1,$2,$3}' file)

答案 2 :(得分:0)

这应该适合您的情况

    NR=0
    while read LINE; do
        ((NR++))
        case $NR in
            1)
                URL=$LINE
                    ;;
            2)
                NAME=$LINE
                    ;;
            3)
                WEB=$LINE
                    ;;
            4)
                if [ $LINE = "--" ]; then
                    NR=0
                    #
                    # DO WHAT EVER YOU WANT TO DO WITH YOUR DATA HERE
                    #
                    #
                    echo "$URL;;$NAME;;$WEB"
                else
                    echo "wrong delimiter found \"$LINE\""
                fi
                    ;;
        esac
    done

运行它
script.sh < inputfile.txt

或者只是将grep命令的输出传递给脚本。