假设我有一些看起来像
的文本文件(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”。请注意,第一组括号中可能有花括号。此外,“=”周围可能没有空格,并且“标题”之前可能有更多的空格。
非常感谢。我只需要一个如何提取这个的工作示例,我可以提取其他东西。
答案 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)
/title *=/
:只对在任意数量的空格后面加上'title'后跟'='的行进行操作s/^[^{]*{\([^,]*\),.*$/\1/
:从该行的开头查找第一个“{”字符。从那时起保存你找到的所有内容,直到你点击逗号','。用您保存的所有内容替换整行s/} *$//p
:除去任意空格的尾部括号'}'并打印结果。title=$(sed -n ... )
:将上述3个步骤的结果保存在名为title
答案 2 :(得分:0)
肯定有更优雅的方式,但凌晨2:40:
title=`cat test | grep "^\s*title\s*=\s*" | sed 's/^\s*title\s*=\s*{?//' | sed 's/}?\s*,\s*$//'`
Grep为我们感兴趣的行,将所有内容剥离并包括开头卷曲,然后从最后一卷到行尾删除所有内容