Bash正则表达式条件

jay*_*yem 8 regex bash conditional

我有一个我需要验证的正则表达式.正则表达式中有双引号,但我似乎无法弄清楚如何正确地逃避它们.

第一次尝试,不起作用,因为引号不会被转义.

while read line
do
  if [[ $line =~ "<a href="(.+)">HTTP</a>" ]]; then
    SOURCE=${BASH_REMATCH[1]}
    break
  fi
done < tmp/source.html

echo "{$SOURCE}" #output = {"link.html"} (with double quotes)
Run Code Online (Sandbox Code Playgroud)

我怎样才能正确运行这个输出是没有双引号的link.html.

我试过了...

while read line
do
  if [[ $line =~ "<a href=/"(.+)/">HTTP</a>" ]]; then
    SOURCE=${BASH_REMATCH[1]}
    break
  fi
done < tmp/source.html

echo "{$SOURCE}" #output = {}
Run Code Online (Sandbox Code Playgroud)

没有运气.有人可以帮助我,这样我就可以不再在我的桌子上敲打头了吗?我对Bash不太满意.谢谢!

Pau*_*ce. 10

将正则表达式放在变量中总是最好的.

pattern='<a href="(.+)">HTTP</a>'
while read line
do
  if [[ $line =~ $pattern ]]; then
    SOURCE=${BASH_REMATCH[1]}
    break
  fi
done < tmp/source.html

echo "{$SOURCE}" #output = {link.html} (without double quotes)
Run Code Online (Sandbox Code Playgroud)

如果引用右侧(模式),它会将匹配从正则表达式更改为简单的字符串(=~实际上变为==).

作为旁注,转义是使用反斜杠(\)而不是斜杠(/),但由于前一段中提到的外部引号,这对你的情况没有帮助.

  • @ chw21:引用模式以允许其中的空格等字符使得模式被视为一个简单的字符串而不是正则表达式,并且匹配等同于`==`而不是`= ~`.在变量赋值中进行引用和转义更加容易,也不那么尴尬. (2认同)