2011-03-02 57 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