2014-08-28 39 views
0

我有一個字符串爲:提取文本

MESSAGES { "Instance":[{"InstanceID":"i-098098"}] } ff23710b29c0220849d4d4eded562770 45c391f7-ea54-47ee-9970-34957336e0b8 

我需要從第一次出現的提取部分{ "Instance":[{"InstanceID":"i-098098"}] }即「{」來的最後一次出現「}」,並保存在一個單獨的文件。

+0

的[在bash提取子(http://stackoverflow.com/questions/428109/extract-substring-in-bash) – 2014-08-28 06:51:27

回答

0

如果你有這樣的一個文件,

sed 's/^[^{]*//;s/[^}]*$//' file 

(這將打印到標準輸出。重定向到一個文件或捕捉到一個變量或做什麼,那就是你想用它做的事。)

如果你有這樣的一個名爲MESSAGES變量,

EXTRACTED=${MESSAGES#*{} 
EXTRACTED="{${EXTRACTED%\}*}}" 
+0

由於可能重複, Triplee它像魅力一樣工作。你可以expalin模式? – user3744067 2014-08-28 09:01:29

+0

'sed'模式由兩個替換組成:在第一個大括號之前替換所有內容,並在最後一個之後替換所有內容。 shell [參數擴展](https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html)是類似的:通過第一個大括號刪除所有內容,最後一個(然後重新提供已移除的大括號)。 – tripleee 2014-08-28 09:50:11

+0

@ user3744067's/^ [^ {] * //'將所有內容替換爲第一個沒有任何內容的「{」。 's/[^}] * $ //'最後一個'}後面的內容全部替換爲空。 '[^}] *'表示每個不是'}的字符。 – 2014-08-28 09:51:39

0

我要麼sedawk從建議。但是,最初的測試顯示其更復雜一點,你可能會需要使用組合或管道:

echo "MESSAGES { "Instance":[{"InstanceID":"i-098098"}] } ff23710b29c0220849d4d4eded562770 45c391f7-ea54-47ee-9970-34957336e0b8" | sed 's/^\(.*\)}.*$/\1}/' | sed 's/^[^{]*{/{/' 

所以第一sed最後}後刪除一切,並用}所以它仍然顯示更換;第二個sed將所有內容刪除至第一個{,並將其替換爲{,以便它仍顯示。

這是我得到的輸出:

{ Instance:[{InstanceID:i-098098}] } 
+1

下面的tripleee的答案可能是更優雅 – SysadminB 2014-08-28 07:08:39

+0

嗨,你可以請分享你採取的詳細方法,因爲你得到的輸出是我所需的輸出。 TIA – user3744067 2014-08-28 08:18:27