sed Regex查找正在使用的数据库名称

sed Regex查找正在使用的数据库名称,regex,sed,Regex,Sed,我有一个文件: Hi USE dbname; Hi 这是SQL文本 我想捕获数据库名: sed-n'1,/^\(USE \;USE\)/{/^\(USE \;USE\)/{/^\(USE \;USE\)\s\+\([a-zA-Z0-9]*\;/\1/p}'001.sql 编辑:为什么我要在这里做:从第1行找到以USE开头的行。在这些行中,抓住以USE开头的那一行。在该行中,替换dbname和print的all 但是,它表示“未知命令\”(1/p前的反斜杠) 我做错了什么?如果您只想提取,请使用

我有一个文件:

Hi
USE dbname;
Hi
这是SQL文本

我想捕获数据库名:

sed-n'1,/^\(USE \;USE\)/{/^\(USE \;USE\)/{/^\(USE \;USE\)\s\+\([a-zA-Z0-9]*\;/\1/p}'001.sql

编辑:为什么我要在这里做:从第1行找到以USE开头的行。在这些行中,抓住以USE开头的那一行。在该行中,替换dbname和print的all

但是,它表示“未知命令\”(1/p前的反斜杠)


我做错了什么?

如果您只想提取,请使用
grep
,它是用来提取东西的

grep -Po '(?i)\bUSE *\K\w+' file
  • -P
    选项将模式解释为Perl正则表达式
  • -o
    选项仅显示与图案匹配的匹配部分
  • (?i)
    使正则表达式不区分大小写
  • \K
    丢弃与该点匹配的所有内容
但如果你想坚持sed,你可以:

sed -n 's/^USE \([[:alnum:]]*\);/\1/pI' file

如果您只想提取,请使用
grep
,它是用于提取内容的

grep -Po '(?i)\bUSE *\K\w+' file
  • -P
    选项将模式解释为Perl正则表达式
  • -o
    选项仅显示与图案匹配的匹配部分
  • (?i)
    使正则表达式不区分大小写
  • \K
    丢弃与该点匹配的所有内容
但如果你想坚持sed,你可以:

sed -n 's/^USE \([[:alnum:]]*\);/\1/pI' file

如果您只想提取,请使用
grep
,它是用于提取内容的

grep -Po '(?i)\bUSE *\K\w+' file
  • -P
    选项将模式解释为Perl正则表达式
  • -o
    选项仅显示与图案匹配的匹配部分
  • (?i)
    使正则表达式不区分大小写
  • \K
    丢弃与该点匹配的所有内容
但如果你想坚持sed,你可以:

sed -n 's/^USE \([[:alnum:]]*\);/\1/pI' file

如果您只想提取,请使用
grep
,它是用于提取内容的

grep -Po '(?i)\bUSE *\K\w+' file
  • -P
    选项将模式解释为Perl正则表达式
  • -o
    选项仅显示与图案匹配的匹配部分
  • (?i)
    使正则表达式不区分大小写
  • \K
    丢弃与该点匹配的所有内容
但如果你想坚持sed,你可以:

sed -n 's/^USE \([[:alnum:]]*\);/\1/pI' file

您可以使用
grep-oP

grep -oP "^ *USE \K\w+" file
或者这个awk:

awk -F 'USE *|;' 'NF>1{print $2}' file
dbname
或者这是:

sed -n '/^ *USE /s/^ *USE \([[:alnum:]]*\).*/\1/p' file
dbname

您可以使用
grep-oP

grep -oP "^ *USE \K\w+" file
或者这个awk:

awk -F 'USE *|;' 'NF>1{print $2}' file
dbname
或者这是:

sed -n '/^ *USE /s/^ *USE \([[:alnum:]]*\).*/\1/p' file
dbname

您可以使用
grep-oP

grep -oP "^ *USE \K\w+" file
或者这个awk:

awk -F 'USE *|;' 'NF>1{print $2}' file
dbname
或者这是:

sed -n '/^ *USE /s/^ *USE \([[:alnum:]]*\).*/\1/p' file
dbname

您可以使用
grep-oP

grep -oP "^ *USE \K\w+" file
或者这个awk:

awk -F 'USE *|;' 'NF>1{print $2}' file
dbname
或者这是:

sed -n '/^ *USE /s/^ *USE \([[:alnum:]]*\).*/\1/p' file
dbname
输出:

dbname
输出:

dbname
输出:

dbname
输出:

dbname



为什么不干脆
grep
使用
^USE
?@anubhava请告诉我为什么不干脆
grep
使用
^anubhava请告诉我为什么不干脆
grep
使用
^USE
?@anubhava请告诉我为什么不干脆
grep
使用
^anubhava请出示美容克。为什么不起作用:
grep-Go的/^USE\s\([a-z]*\)/\1/'001.sql
G
选项解释为一个基本正则表达式,您不能对grep使用替换运算符。当grep说只输出匹配的部分时,它会是什么?因为在正则表达式中,人们只希望对字符串的一部分进行分组。没有perl正则表达式可以吗?(我不知道)是的,我的意思是在正则表达式中,你如何告诉grep“只打印匹配的部分”,这是匹配字符串的一个子部分,所以我必须使用Perl正则表达式,在BRE上不可能?谢谢。为什么不起作用:
grep-Go的/^USE\s\([a-z]*\)/\1/'001.sql
G
选项解释为一个基本正则表达式,您不能对grep使用替换运算符。当grep说只输出匹配的部分时,它会是什么?因为在正则表达式中,人们只希望对字符串的一部分进行分组。没有perl正则表达式可以吗?(我不知道)是的,我的意思是在正则表达式中,你如何告诉grep“只打印匹配的部分”,这是匹配字符串的一个子部分,所以我必须使用Perl正则表达式,在BRE上不可能?谢谢。为什么不起作用:
grep-Go的/^USE\s\([a-z]*\)/\1/'001.sql
G
选项解释为一个基本正则表达式,您不能对grep使用替换运算符。当grep说只输出匹配的部分时,它会是什么?因为在正则表达式中,人们只希望对字符串的一部分进行分组。没有perl正则表达式可以吗?(我不知道)是的,我的意思是在正则表达式中,你如何告诉grep“只打印匹配的部分”,这是匹配字符串的一个子部分,所以我必须使用Perl正则表达式,在BRE上不可能?谢谢。为什么不起作用:
grep-Go的/^USE\s\([a-z]*\)/\1/'001.sql
G
选项解释为一个基本正则表达式,您不能对grep使用替换运算符。当grep说只输出匹配的部分时,它会是什么?因为在正则表达式中,人们只希望对字符串的一部分进行分组。没有perl正则表达式可以吗?(我不知道)是的,我的意思是在正则表达式中,你如何告诉grep“只打印匹配的部分”,这是匹配字符串的一个子部分,所以我必须使用Perl正则表达式,在BRE上不可能?谢谢。为什么不起作用:
grep-Go的/^USE\s\([a-z]*\)/\1/'001.sql
?在sed命令中,为什么它以空格开头而不是USE | USE?我发现这是我不明白的事实,它不是从空格开始的。它以
^*
开头,意思是匹配
行开始
,然后是
0或更多空格
,然后再匹配
使用
谢谢。为什么不起作用:
grep-Go的/^USE\s\([a-z]*\)/\1/'001.sql
?在sed命令中,为什么它以空格而不是空格开头