Sed匹配到行尾

时间:2011-05-20 12:02:23

标签: bash sed

我有一个mysqldump,有几行像

CONSTRAINT `FK5E61277CBAE1E8F6` FOREIGN KEY (`action_item_group_id`) REFERENCES `action_item_group` (`id`),

CONSTRAINT `FK5E61277CBAE1E8F6` FOREIGN KEY (`action_item_group_id`) REFERENCES `action_item_group` (`id`)

我想在逗号之前添加单词ON UPDATE CASCADE,如果它存在的话。

在Vi中我将其与: /CONSTRAINT\ .*\ FOREIGN\ KEY\ .*\ REFERENCES\ .*\ \(.*\) 如果存在,则为逗号提供准确的文本,如果不存在,则直到行的末尾。

但是现在sed我做了:

sed -e "s/CONSTRAINT\ .*\ FOREIGN\ KEY\ .*\ REFERENCES\ .*\ \(.*\)/&\ ON\ UPDATE\ CASCADE/"

问题是&也与逗号匹配,我得到输出

CONSTRAINT `FK5E61277C881C85E3` FOREIGN KEY (`created_by_employee_id`) REFERENCES `employee` (`id`), ON UPDATE CASCADE

如何在逗号之前获取ON UPDATE CASCADE

4 个答案:

答案 0 :(得分:2)

尝试删除替换表达式中括号前的\

sed -e "s/CONSTRAINT\ .*\ FOREIGN\ KEY\ .*\ REFERENCES\ .*\ (.*)/&\ ON\ UPDATE\ CASCADE/"

\(表示组的开头,而不是括号。 (只是匹配左派。

答案 1 :(得分:2)

“扩展”正则表达式(-r标记sed)总是对我更有意义。然后你得到\(意味着一个字面括号而(意味着一个组的开始,这是你似乎期待的(按照Diego Sevilla)。这对我有用:

echo 'CONSTRAINT `FK5E61277CBAE1E8F6` FOREIGN KEY (`action_item_group_id`) REFERENCES `action_item_group` (`id`),' | sed -r "s/CONSTRAINT\ .*\ FOREIGN\ KEY\ .*\ REFERENCES\ .*\ \(.*\)/&\ ON\ UPDATE\ CASCADE/"

结果:

CONSTRAINT `FK5E61277CBAE1E8F6` FOREIGN KEY (`action_item_group_id`) REFERENCES `action_item_group` (`id`) ON UPDATE CASCADE,

答案 2 :(得分:2)

轻松AWK

实施例

cat filename.sql | awk '{ cnstr = match($0, "CONSTRAINT"); if (cnstr != 0) { idx = match($0,"\,[^\,]*$"); if (idx == 0) { print $0 " ON UPDATE CASCADE" } else { print substr($0,0,idx-1) " ON UPDATE CASCADE," } } else { print $0 } }' > output.sql

NB

匹配中的CONSTRAINT可以替换为您要匹配的正则表达式。这只是一个简单的例子。它应该工作。

答案 3 :(得分:0)

你不能只用,取代ON UPDATE CASCADE,或者我是否误解了这个问题?

$ echo "some string ending with ," | sed 's/,/NEW,/'
some string ending with NEW,