2015-11-28 40 views
0

開始我從Mendeley導出一個名爲.bib文件,其中標題條目用雙括號,如:sed的 - 雙進單括號如果符合模式

title = {{Nonparametric Permutation Tests for {\{PET{\}} functional Neuroimaging Experiments: A Primer with examples}}, 

我想用sed來檢查是否符合「稱號」開頭,如果是,以逗號之前刪除第一雙括號,最終的,導致:

title = {Nonparametric Permutation Tests for {\{PET{\}} functional Neuroimaging Experiments: A Primer with examples}, 

我知道有很好的文檔瞭解如何檢查各地對於起始模式,如何轉義元字符以及如何保存匹配以供稍後用於替代ution,但我沒有經驗與正則表達式和我嘗試迄今導致垃圾或錯誤(例如):

sed: 1: "/^title/s/\{\{[^]]*\}\} ...": RE error: invalid repetition count(s) 

有誰知道這種替代問題的解決方案?

+0

嘗試'sed的 「S/^ \(標題= \){{\([^ {] \ + \)}},$/\ 1 {\ 2},/克」 input.txt' – amdixon

+0

這一個沒有工作.. – dangom

+0

@dpgomez:你在使用GNU Sed嗎?你有沒有在''sed'命令行中加入'-r'? GNU'sed'確實使事情複雜化了,因爲(AFAIUI)試圖去判斷是否應該使用擴展的正則表達式,如果缺少'-r',並且在大括號構成匹配字符串的一部分的情況下,它實際上是肯定會猜錯。 –

回答

0

這似乎是個伎倆。

$ echo "title = {{Nonparametric Permutation Tests for {\{PET{\}} functional Neuroimaging Experiments: A Primer with examples}}," | 
> sed 's/^title = {{\(.*\)}},$/title = {\1},/' 
title = {Nonparametric Permutation Tests for {\{PET{\}} functional Neuroimaging Experiments: A Primer with examples}, 
$ echo "title = {{The UNIX-HATERS Handbook}}," | 
> sed 's/^title = {{\(.*\)}},$/title = {\1},/' 
title = {The UNIX-HATERS Handbook}, 
$ 

與我在comment較早提出,正則表達式有$錨定}},到行的末尾,嚴格要求title = {{在該行的開始,相比雖然作爲ghastligram標題沒有按嵌入}}之後沒有逗號,原始sed腳本也有效。只要標題總是在一行上,不管它多長時間,這應該可以做到。我讓比賽比評論更加嚴格,所以它不會破壞任何已經從雙花括號轉換爲單花括號的冠軍;腳本的前幾版會錯位對非常複雜的標題(其中那些在標題的身體包含{{}})一些變化,但這不會,除非原來實際上包含title = {{{Brace yourselves}}}

經過Mac OS X 10.11.1測試並同時使用BSD(Mac OS X)sed和GNU sed;相同的輸出。