我有一个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
?
答案 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,