2011-05-20 79 views
0

我有几行一样桑达匹配到线路

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添加的话每一个这些的mysqldump的,逗号之前的末端,如果存在。 /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我?

回答

2

“扩展” 的正则表达式(-r国旗sed)总是让我更有意义。然后你得到\(这意味着一个字面括号和(意味着一个组的开始,这是你似乎期待的(按照迭戈塞维利亚)。这个工作对我来说:

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

尝试移除在替代表达式括号前的\

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

\(是指基团,而不是一个括号的开始。 (只是匹配左paren。

0

难道你不能只用ON UPDATE CASCADE,替换,还是我误解了这个问题?

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

对于没有逗号的行不起作用。这些也必须添加'更新级联' – 2011-05-20 12:26:46

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可以替换为任何想匹配的正则表达式。这只是一个简单的例子。它应该工作。

+0

这也适用于我。 – 2011-05-20 13:41:27