为什么grep与空格前的其余部分不匹配?

时间:2014-03-17 23:25:40

标签: regex bash grep

我有以下代码:

#!/bin/bash

arrvar=( $(cat input.txt | grep -Poh '^[A-Z0-9_]+=.+') )
arrlen=${#arrvar[@]}
let arrlen--

i=0
while : ; do
    echo "item $i..: ${arrvar[i]}"

    let i++
    if [ $i -gt $arrlen ]; then
      break
    fi
done

在input.txt中填写此内容:

HELLO=123 456
STACK=456 756
OVERFLOW=756 789

结果如下:

item 0..: HELLO=123
item 1..: 456
item 2..: STACK=456
item 3..: 756
item 4..: OVERFLOW=756
item 5..: 789

如果表达式.+与所有字符匹配,为什么它不会在空格之前匹配任何内容?

我正在寻找这个输出:

item 0..: HELLO=123 456
item 1..: STACK=456 756
item 2..: OVERFLOW=756 789
你可以给我一个详尽的解释吗?我很感兴趣。

1 个答案:

答案 0 :(得分:1)

通过执行IFSIFS=$'\n'设置为换行符。这将分隔换行符上的字段,而不是space,这是默认值IFS

重新使用现有脚本:

#!/bin/bash

IFS=$'\n'
arrvar=( $(cat input.txt | grep -Poh '^[A-Z0-9_]+=.+') )
arrlen=${#arrvar[@]}
let arrlen--

i=0
while : ; do
    echo "item $i..: ${arrvar[i]}"

    let i++
    if [ $i -gt $arrlen ]; then
      break
    fi
done