【问题标题】:sed - double into single braces if line starts with patternsed - 如果行以模式开头,则加倍成单大括号
【发布时间】:2015-11-29 07:01:54
【问题描述】:

我有一个从 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)

有人知道这个替换问题的解决方案吗?

【问题讨论】:

  • 试试sed "s/^\(title = \){{\([^{]\+\)}},$/\1{\2},/g" input.txt
  • 这个没用..
  • @dpgomez:你在使用 GNU Sed 吗?您是否在sed 命令行中添加了类似-r 的内容? GNU sed 确实使事情变得复杂,因为 (AFAIUI) 它试图判断是否应该在 -r 丢失的情况下使用扩展正则表达式,并且在大括号形成这样的匹配字符串的一部分的情况下,几乎可以肯定猜错了。
  • 我在 OS X 上使用 sed
  • 你不会在 Mac OS X Sed 命令中添加-E 选项,是吗?

标签: regex bash sed


【解决方案1】:

这似乎可以解决问题。

$ 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;相同的输出。

【讨论】:

    猜你喜欢
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    相关资源
    最近更新 更多