2014-01-08 25 views
1

我想寫一個bash腳本,讀取文件跳過註釋行。你在bash中如何匹配^ [ s] *?

我:

#!/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:]得到相同的結果。

這個正則表達式應該如何寫?

回答

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 
##### 
0
  • 不啓動Wi第一個哈希
  • 不具有無限的空間,隨後的哈希

(?!^#|^\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

+0

我覺得^ \ S *#將運行一點點更快,因爲它不必等待得到該行的前結束繼續...但如果我保持線路而不是跳過線路,這將是一件好事! –

+0

哦對。我以爲你想匹配沒有以散列開頭的行。 –

1

你缺少你的模式括號:

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

你想要做什麼。

0

[:space:]是括號表達式,將匹配的任意字符的:一個Çëp小號

[[: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