我已经坚持了很长时间。我想在一个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;。)
答案 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"
等