2011-03-02 56 views
2

假设我有一些文本文件(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”。请注意,第一组大括号中可能会有花括号。此外,“=”周围可能没有空格,“标题”之前可能会有更多空格。

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

回答

4

这给一试:

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

说明:

  • /^[[:blank:]]*title[[:blank:]]*=[[:blank:]]*{/ { - 如果某行匹配这个正则表达式
    • s/// - 删除一致部分
    • s/}[^}]*$//p - 删除最后一个关闭大括号和每个角色,直到第二个都不是关闭大括号行和打印
  • }电子端 - 端如果
+0

+1后,我改变了我的脚本采取了这样的情况,其中一个逗号可以在存在的价值bash的变量以上3个步骤的结果我得到确切你的脚本。我已经告诉OP接受你的,但我认为你应该把它封装成title = $(sed ...)'来完全满足他的要求。 – SiegeX 2011-03-02 21:57:29

0

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

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

grep命令我们感兴趣的行,剥去一切,包括卷曲的开头,然后剥去从最后卷曲到该行末尾的所有内容

+0

不适合我。 – 2011-03-02 20:56:42

+0

你能提供更多细节吗?什么是错误信息? – 2011-03-02 21:22:56

2
title=$(sed -n '/title *=/{s/^[^{]*{\([^,]*\),.*$/\1/;s/} *$//p}' ./f1.txt) 
  1. /title *=/:仅作用于具有后跟一个“=”的空间
  2. s/^[^{]*{\([^,]*\),.*$/\1/任意数量的后半句“标题”线:从线看为先“{”字符的开始。从那一刻起,保存你发现的所有东西,直到你输入一个逗号“,”。将整个行全部替换为您保存的所有内容
  3. s/} *$//p:删除拖尾大括号'}'以及任何空格并打印结果。
  4. title=$(sed -n ...):保存在一个名为title
+0

谢谢。但是,如果在我想要捕获的内容中有逗号呢?然后由于“第一个逗号”逻辑它不起作用。我们如何结合其他逗号的灵活性?谢谢 – 2011-03-02 20:39:32

+0

@Vinh你应该接受丹尼斯的回答,因为在我改变了我的剧本来处理逗号可能出现在名字中的情况之后,我得到了他的剧本。你需要做的唯一事情就是将他的脚本包装在''()''中,就像我的一样。 – SiegeX 2011-03-02 21:55:44