帮助正则表达式 - 提取文本

时间:2011-03-02 02:35:07

标签: regex bash sed bibtex

假设我有一些看起来像

的文本文件(f1.txt,f2.txt,...)
@article {paper1,
author = {some author},
title = {some {T}itle} ,
journal = {journal},
volume = {16},
number = {4},
publisher = {John Wiley & Sons, Ltd.},
issn = {some number},
url = {some url},
doi = {some number},
pages = {1},
year = {1997},
}

我想提取标题的内容并将其存储在bash变量(称为$ title)中,即示例中的“some {T} itle”。请注意,第一组括号中可能有花括号。此外,“=”周围可能没有空格,并且“标题”之前可能有更多的空格。

非常感谢。我只需要一个如何提取这个的工作示例,我可以提取其他东西。

3 个答案:

答案 0 :(得分:4)

尝试一下:

title=$(sed -n '/^[[:blank:]]*title[[:blank:]]*=[[:blank:]]*{/ {s///; s/}[^}]*$//p}' inputfile)

说明:

  • /^[[:blank:]]*title[[:blank:]]*=[[:blank:]]*{/ { - 如果一行符合此正则表达式
    • s/// - 删除匹配的部分
    • s/}[^}]*$//p - 删除最后一个结束花括号和每个不是结束花括号的字符,直到行尾并打印
  • } - 结束如果

答案 1 :(得分:2)

title=$(sed -n '/title *=/{s/^[^{]*{\([^,]*\),.*$/\1/;s/} *$//p}' ./f1.txt)
  1. /title *=/:只对在任意数量的空格后面加上'title'后跟'='的行进行操作
  2. s/^[^{]*{\([^,]*\),.*$/\1/:从该行的开头查找第一个“{”字符。从那时起保存你找到的所有内容,直到你点击逗号','。用您保存的所有内容替换整行
  3. s/} *$//p:除去任意空格的尾部括号'}'并打印结果。
  4. title=$(sed -n ... ):将上述3个步骤的结果保存在名为title
  5. 的bash变量中

答案 2 :(得分:0)

肯定有更优雅的方式,但凌晨2:40:

title=`cat test | grep "^\s*title\s*=\s*" | sed 's/^\s*title\s*=\s*{?//' | sed 's/}?\s*,\s*$//'`

Grep为我们感兴趣的行,将所有内容剥离并包括开头卷曲,然后从最后一卷到行尾删除所有内容