我正在尝试编写一个读取文件的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:]
得到了相同的结果。
如何写这个正则表达式?
答案 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