【问题标题】:help with regex - extracting text正则表达式帮助 - 提取文本
【发布时间】:2011-03-03 06:10:47
【问题描述】:

假设我有一些看起来像这样的文本文件(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”之前可能有更多空格。

非常感谢。我只需要一个工作示例来说明如何提取它,然后我可以提取其他东西。

【问题讨论】:

    标签: regex bash sed bibtex


    【解决方案1】:

    试试这个:

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

    解释:

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

    【讨论】:

    • +1 在我更改脚本以处理值中可能存在逗号的情况后,我得到了您的脚本。我已经告诉 OP 接受你的,但我认为你应该把它包装起来 title=$(sed ...) 以完全满足他的要求。
    【解决方案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的bash变量中

    【讨论】:

    • 谢谢。但是,如果我要捕获的内容中有逗号怎么办?然后由于“第一个逗号”逻辑,它不起作用。我们如何结合附加逗号的灵活性?谢谢
    • @Vinh 您应该接受丹尼斯的回答,因为在我更改脚本以处理名称中可能包含逗号的情况后,我得到了他的脚本。您唯一需要做的就是将他的脚本包装在 $() 中,就像我的一样。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-10
      • 2011-06-10
      • 1970-01-01
      相关资源
      最近更新 更多