包含括号的匹配模式与sed

时间:2014-06-10 08:30:16

标签: regex bash sed

我需要插入' - '如果行包含单词VARCHAR(1000)

,则在行的开头

我的档案样本是:

  

TRIM(CAST(" AP_RQ_MSG_TYPE_ID" AS NVARCHAR(1000)))AP_RQ_MSG_TYPE_ID,   TRIM(CAST(" AP_RQ_PROCESSING_CD" AS NVARCHAR(1000)))   AP_RQ_PROCESSING_CD,TRIM(CAST(" AP_RQ_ACQ_INST_ID" AS NVARCHAR(11)))   AP_RQ_ACQ_INST_ID,TRIM(CAST(" AP_RQ_LOCAL_TXN_TIME" AS NVARCHAR(10)))   AP_RQ_LOCAL_TXN_TIME,TRIM(CAST(" AP_RQ_LOCAL_TXN_DATE" AS)   NVARCHAR(10)))AP_RQ_LOCAL_TXN_DATE,TRIM(CAST(" AP_RQ_RETAILER" AS)   NVARCHAR(11)))AP_RQ_RETAILER,

我使用了这个命令

sed 's/\(^.*VARCHAR\(1000\).*$\)/--\1/I' *.sql

但结果并不像预期的那样。 有谁知道我做错了什么?

3 个答案:

答案 0 :(得分:1)

这应该做:

sed 's/.*VARCHAR(1000).*/--&/' file

sed命令中的问题出在正则表达式部分。默认情况下,sed使用BRE,这意味着,( and )(包裹1000)只是字面括号,你应该逃避它们,或者你赋予它们特殊含义:正则表达式分组。

您已转义的第一个和最后一个(..),如果您想稍后通过\1引用它,那么您做得对。所以你的问题是逃避或不逃避。 :)

答案 1 :(得分:0)

使用以下sed命令:

sed '/VARCHAR(1000)/ s/.*/--\0/' *.sql

s命令适用于包含VARCHAR(1000)的所有行。然后,它将.*整个行\0替换为前面的--

答案 2 :(得分:0)

通过awk,

awk '/VARCHAR\(1000\)/ {sub (/^/,"--")}1' infile > outfile