2014-11-25 48 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

相关问题