你如何在bash中匹配^ [\ s] *?

时间:2014-01-08 22:46:16

标签: regex bash space

我正在尝试编写一个读取文件的bash脚本来跳过注释行。

我有:

#!/bin/bash
### read file
IFS=$'\r\n'
while read line; do
    match_pattern="^[:space:]*#"
    if [[ "$line" =~ $match_pattern ]];
        then 
        echo "#####"
        continue
    fi  
    #semicolons and commas are removed everywhere...
    array+=($line)
done <list.txt

这会跳过以“#”开头的行,但不会跳过以空格开头然后是英镑的行。即:"^\s+#"

我使用[:blank:]得到了相同的结果。

如何写这个正则表达式?

4 个答案:

答案 0 :(得分:1)

您的模式中缺少括号:

match_pattern="^[[:space:]]*#"

做你想做的事。

答案 1 :(得分:0)

这对我有用:

while read line; do
    match_pattern="^\s*#"
    if [[ "$line" =~ $match_pattern ]]; then
        echo "#####"
    fi
done

<强>输入

One
#Two
    #Three
# Four
    # Five
####Six

<强>输出

One
#Two
#####
    #Three
#####
# Four
#####
   # Five
#####
####Six
#####

答案 2 :(得分:0)

  • 不以哈希
  • 开头
  • 不以无限空格开头,后跟哈希

(?!^#|^\s+#)^.*$

从您问题中的代码中得出此结果:

IFS=$'\r\n'
while read line; do
    match_pattern="^[:space:]*#"
    if [[ "$line" =~ $match_pattern ]];
        then 
        echo "#####"
        continue
    fi  
    array+=($line)
done <list.txt

它会匹配看起来像这样的行:

while read line; do #while loop

答案 3 :(得分:0)

[:space:]是一个括号表达式,它将匹配任何字符 a c e p s

[[:space:]]是包含字符类的括号表达式:它将匹配空格字符。

$ s="   # x"
$ [[ $s =~ ^[:blank:]*# ]] && echo match || echo no match
no match
$ [[ $s =~ ^[[:blank:]]*# ]] && echo match || echo no match
match

bash的extended patterns也可以处理这个问题

$ shopt -s extglob
$ [[ $s == *([[:blank:]])#* ]] && echo match || echo no match
match