sed Regex在USE句子中找到数据库的名称

时间:2014-09-10 17:40:44

标签: regex sed

我有一个文件:

Hi
USE dbname;
Hi

哪个是SQL文本。

我想捕获dbname:

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

编辑:我为什么尝试这样做:从第1行到以USE开头的行查找。在这些行中,抓住以USE开头的行。在该行中,将所有内容替换为dbname并打印。

然而,它显示'未知命令'(在1 / p之前反斜杠)

我做错了什么?

3 个答案:

答案 0 :(得分:1)

如果您只想提取,请使用grep,这是为了提取内容。

grep -Po '(?i)\bUSE *\K\w+' file
  • -P选项将模式解释为Perl正则表达式。
  • -o选项仅显示与模式匹配的匹配部分。
  • (?i)使正则表达式不区分大小写。
  • \K抛弃了与此相匹配的所有内容。

但如果你想坚持使用sed,你可以这样做:

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

答案 1 :(得分:1)

您可以使用grep -oP

grep -oP "^ *USE \K\w+" file

或者这个awk:

awk -F 'USE *|;' 'NF>1{print $2}' file
dbname

或者这个sed:

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

答案 2 :(得分:1)

sed -nE 's/^USE (.+);/\1/p' file

输出:

dbname