sed - 如果行以pattern开头,则加倍成单个括号

时间:2015-11-28 22:26:24

标签: regex bash sed

我有一个从Mendeley导出的.bib文件,其中标题条目用双括号括起来,如:

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

我想使用sed检查一行是否以" title"开头,如果是,则删除第一个双括号,以及逗号之前的最后一行,结果是:

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

我知道有关于如何检查起始模式,如何转义元字符以及如何保存匹配以供以后用于替换的良好文档,但我对正则表达式缺乏经验并且我的尝试到目前为止导致垃圾或错误(例如):

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

有没有人知道这个替代问题的解决方案?

1 个答案:

答案 0 :(得分: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脚本也可以使用。只要标题总是在一行上,无论它有多长,这应该可以解决问题。我使比赛比评论更严格,所以它不会破坏任何已经从双括号转换为单括号的标题;以前版本的脚本会破坏真正复杂的标题(标题正文中包含{{}}的标题)的一些变体,但除非原始实际包含{ {1}}。

使用Mac OS X 10.11.1测试并同时使用BSD(Mac OS X)title = {{{Brace yourselves}}}和GNU sed;相同的输出。

相关问题