2014-11-25 82 views
2

我寫在乳膠文件和我正在尋找一種方法來自動刪除我的文檔一些色彩。當有\文本顏色中的文本添加{|}更新{...},它應該保持和\文本顏色內evreything {}刪除{...}應予以刪除。當然\ textcolor也應該被刪除。BASH:如何提取特定的大括號之間的文本,並讓對方

我只是找不到一個正則表達式將匹配。它只是採取的第一個和該行的最後一個大括號不cheking他們屬於文本顏色。

這是我的代碼:

for i in [email protected] 
do 
sed -i 's/\\textcolor{update}{\(.*\)\}/\1/g' $i 
sed -i 's/\\textcolor{add}{\(.*\)\}/\1/g' $i 
sed -i 's/\\textcolor{delete}{\(.*\)\}//g' $i 
done 

舉例來說,如果我有這樣的:

這不會改變和\ {文本顏色UDPATE} {這是我修改 \ textbf {文字}!} \ {VSPACE 0.3}

我得到這個:

這不會改變,這是我修改\ textbf {文本}}! \ {VSPACE 0.3

我應該得到這樣的結果:

這不會改變,這是我修改過的\ textbf {text} !! \ {VSPACE 0.3}

此外,我也想能夠得到這一結果:

這不會改變和\ {文本顏色刪除} {這是我刪除 \ textbf {文本}!} \ {VSPACE 0.3}

這不會改變和\ {VSPACE 0.3}

到目前爲止,我竭力避免與一個200行的腳本這個問題,但我敢肯定有使用sed例如一個簡單的方法。

非常感謝!

+0

嘗試'sed的 'S/\\的文字顏色{更新} {\([^}] \ + \)\}/\ 1 /'':) – 2014-11-25 10:26:06

+0

我很抱歉不工作(一個大括號是不是在正確的地方),但它是接近:) – 2014-11-26 19:32:20

回答

1

我不知道如何做到這一點的sed,並知道這是不可能的,一般爲單獨的正則表達式來解決,但這種perl的片斷可能做的伎倆:

perl -0e '$_ = <>;s/\\textcolor{(?:update|delete|add)}({((?s:[^{}]++|(?1))*)})/$2/sg; print' 
+0

它工作得很好!非常感謝你,我非常感謝! :) – 2014-11-26 19:34:00

0

這可能會爲你工作(GNU SED):

sed -i 's/\\textcolor{\(update\|add\)}{\([^}]*\)\}/\2/g;s/\\textcolor{delete}{\([^}]*\)\}//g' file 
+0

謝謝你,但它似乎不工作: 如果我的文字包含: 這不會改變和\ {文本顏色UDPATE} {這是我修改\ textbf {文本} !!} \ vspace {0.3} 這不會改變和\ textcolor {刪除} {這是我刪除\ textbf {文本} !!} \ vspace {0.3} 我明白了: 這不會改變, \ textcolor {udpate} {這是我修改的\ textbf {text} !!} \ vspace {0.3} 這不會改變,!!} \ vspace {0.3} – 2014-11-25 10:02:55

相關問題