正则表达式在Bash脚本中不匹配,但regex101.com验证它

时间:2015-07-25 22:31:44

标签: regex bash

我已经坚持了很长时间。我想在一个SQL文件中读取并挑选出任何类似于" CREATE TABLE tablename("。如果我将这些行中的一行与我的正则表达式粘贴到regex101.com中,它匹配,但是我的Bash脚本与任何行都不匹配,我不知道为什么。我对Bash脚本和正则表达式都是新手,所以我可能会遗漏一些东西。发生了什么,有什么事情发生了与换行符有什么关系?

这是我的代码:

#/bin/sh

pattern='/^CREATE\ TABLE\ .*$/s'

while read line
do
echo line: $line
if [[ $line =~ $pattern ]]; then
echo matches!
fi
done < "test.txt"

的test.txt:

CREATE TABLE mytablename(
CREATE TABLE mytablename(
CREATE TABLE mytablename(
CREATE TABLE mytablename(
CREATE TABLE mytablename(
CREATE TABLE mytablename(
CREATE TABLE mytablename(
CREATE TABLE mytablename(

输出:

line: CREATE TABLE mytablename(
line: CREATE TABLE mytablename(
line: CREATE TABLE mytablename(
line: CREATE TABLE mytablename(
line: CREATE TABLE mytablename(
line: CREATE TABLE mytablename(
line: CREATE TABLE mytablename(
line: CREATE TABLE mytablename(
line:

它不打印&#34;匹配!&#34;,但Regex101找到匹配项。 (是的,这是我在&#34之后输入的新行;(&#34;。) Regex101

1 个答案:

答案 0 :(得分:7)

主要问题是您正在尝试在正则表达式中使用PCRE s选项,该正则表达式使用普通ERE匹配而没有选项语法。它试图匹配文字斜杠和字符“s”。

作为次要问题,您的shebang无效并指向可能不支持/bin/sh[[ ]]的{​​{1}}。

如果用=~替换shebang并使用与您想要的文本匹配的ERE,它可以正常工作:

#!/bin/bash

给出

#!/bin/bash

pattern='^CREATE TABLE .*$'

while read line
do
echo line: $line
if [[ $line =~ $pattern ]]; then
echo matches!
fi
done < "test.txt"