正则表达式的Bash脚本在Ubuntu上不起作用

时间:2012-07-03 14:56:45

标签: regex bash ubuntu

我有一个正在我的OpenSuSE框上工作的Bash脚本,但是当复制到我的Ubuntu框时,无效。该脚本从文件读入。该文件的字段由空格(制表符和空格)分隔。

#!/bin/bash
function test1()
{
    while read LINE
    do
        if [[ $LINE =~ "^$" || $LINE =~ "^#.*" ]] ; then
            continue;
        fi
        set -- $LINE
        local field1=$1
        local field2=$2
    done < test.file
}

test1

test.file包含:

# Field1Header    Field2Header
abcdef            A-2
ghijkl            B-3

似乎有两个问题:

(1)$ field2,带连字符的那个,是空白的

(2)删除以#开头的空行和行的正则表达式

任何人都知道什么是错的?正如我所说,它在OpenSuSE上运行良好。

谢谢, 保罗

3 个答案:

答案 0 :(得分:3)

  1. 引用错误,这可能是正则表达式失败的原因。
  2. 无需使用bashisms。
  3. 无需使用set
  4. 尝试

    while read field1 field2 dummy
    do
        if ! test "${field1%%#*}"
        then
            continue
        fi
        # do stuff here
    done
    

    编辑:使用set

    的明显版本
    while read -r line
    do
        if ! test "${line%%#*}"
        then
            continue
        fi
        set -- $line
        do_stuff_with "$@"
    done
    

答案 1 :(得分:3)

显然,从bash 3.2开始,不应引用正则表达式。所以这应该有效:

#!/bin/bash
while read LINE
do
    if [[ $LINE =~ ^$ || $LINE =~ ^#.* ]] ; then
        continue;
    fi
    set -- $LINE
    local field1=$1
    local field2=$2
done < test.file

编辑:你应该使用Jo So的答案,因为它绝对更清洁。但我正在解释为什么正则表达式失败以及OpenSuse和Ubuntu之间不同行为背后的原因(很可能是不同版本的bash)

答案 2 :(得分:-2)

在我的ubuntu上没有像&#34; =〜&#34; for test命令。只需使用这个:

if [[ $LINE = "" || ${LINE:0:1} = "#" ]] ; then
    continue;
fi