我正在尝试使用grep列出包含linux系统上特定字符串变体的目录中的所有文件。这些文件是存储过程的DDL,我正在寻找具有精度为2的NUMERIC或DECIMAL声明的所有文件(即DECIMAL(x,2)或NUMERIC(x,2))。不区分大小写,并且空格将被忽略。
示例:
DECIMAL(13,2)
DECIMAL(13, 2)
DECIMAL( 13, 2 )
Decimal(13 , 2)
DECIMAL ( 13, 2 )
NUMERIC(13 , 2)
numeric ( 13 , 2)
NUMERIC(8,2 )
CAST(INT (PURCHASE_DATE ) AS NUMERIC(8,0)) AS BUYDATE;
到目前为止我想出的是:
grep --include='*.DDL' -inP 'sproc' -e '.*Numeric|Decimal *\( *[0-9] *\, *2 *\).*'
但当然,它不起作用,我只是错过了原因。任何帮助将不胜感激。
答案 0 :(得分:1)
由于你使用-P
,你应该为每个空间使用caracter类或scapes
grep --include='*.DDL' -inP -e '.*Numeric|Decimal[ ]*\([ ]*[0-9][ ]*\,[ ]*2[ ]*\).*'
或
grep --include='*.DDL' -inP -e '.*Numeric|Decimal\s*\(\s*[0-9]\s*\,\s*2\s*\).*'
甚至:
grep --include='*.DDL' -inP -e '.*Numeric|Decimal\ *\(\ *[0-9]\ *\,\ *2\ *\).*'
我个人更喜欢第一个,对我来说似乎更清楚。
为了说清楚,-i
也会使搜索案例不敏感。
答案 1 :(得分:0)
我会像这样执行搜索:
grep --include='*.DDL' -inRP 'REGEX' *
有了这个REGEX:
(([Dd][Ee][Cc][Ii][Mm][Aa][Ll])|([Nn][Uu][Mm][Ee][Rr][Ii][Cc]))\s*\(\s*\d+\s*,\s*\d{1,2}\s*\)
将匹配您的示例,并且:
nUmErIc(1,3)
DeCiMaL(2,12)
不匹配:
DeCiMaL(1,123)
DeCiMaL(2,1 2)
如果您已使用-e
,则不需要-P
标记。此外,您需要指定要搜索的路径,我使用*
,并在存在子文件夹时添加-R
标记。