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},
}

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

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

4

3 回答 3

4

试试这个:

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

解释:

  • /^[[:blank:]]*title[[:blank:]]*=[[:blank:]]*{/ {- 如果一行匹配这个正则表达式
    • s///- 删除匹配的部分
    • s/}[^}]*$//p- 删除最后一个右大括号和每个不是右大括号的字符,直到行尾并打印
  • }- 万一
于 2011-03-02T02:38:48.253 回答
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 步的结果保存在名为的 bash 变量中title
于 2011-03-02T02:55:08.683 回答
0

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

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

搜索我们感兴趣的行,剥去包括开头卷曲在内的所有内容,然后剥去从最后一个卷曲到行尾的所有内容

于 2011-03-02T02:41:42.427 回答