我有一个文件:
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之前反斜杠)
我做错了什么?
答案 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