2011-05-20 91 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