[英]How to extract between to tokens in text file using bash and manipulate output
[英]How to extract from a file text between tokens using bash scripts
我在讀這個問題: 使用bash在文本文件中提取2個標記之間的行,因為我有一個非常相似的問題...我必須在此xml文件中提取文本(並將其保存到$ variable,然后再打印):
<--more labels up this line>
<ExtraDataItem name="GUI/LastVMSelected" value="14cd3204-4774-46b8-be89-cc834efcba89"/>
<--more labels and text down this line-->
我只需要獲取value =(顯然沒有方括號,也沒有'value ='),但是首先,我認為它必須搜索“ GUI / LastVMSelected”才能到達這一行,因為在其他地方可能存在類似的value字段行,而該標簽的值就是我想要的。
如果它們在同一行上(如您的示例所示),則更加容易。 只是:
sed -ne '/name="GUI\/LastVMSelected"/s/.*value="\([^"]*\)".*/\1/p'
說明:
我假設您是從XML文檔中提取的。 如果是這種情況,請查看用於處理XML的XMLStarlet命令行工具。 有查詢XML文檔的一些文件在這里 。
用這個:
for f in `grep "GUI/LastVMSelected" filename.txt | cut -d " " -f3`; do echo ${f:7:36}; done
grep
只為您提供所需的行 cut
使用一些分隔符分割線,並返回分割的第N個結果 -d " "
將分隔符設置為空格 -f3
返回第三個結果(基於1的索引) ${f:7:36}
提取從索引7開始的36個字符的子字符串。 這樣就消除了前導value="
和尾部斜杠等。 顯然,如果字段的順序改變了,這將中斷,但是如果您只是在想一些又快又臟的方法,那應該就是它。
使用我從您鏈接的問題中得到的答案:
sed -n '/<!--more labels up this line-->/{:a;n;/<!--more labels and text down this line-->/b;\|GUI/LastVMSelected|s/value="\([^=]*\)"/\1/p;ba}' inputfile
說明:
-n
不要隱式打印 /<!-- this is token 1 -->/{
-如果找到起始標記,則
:a
a-標簽“ a”
n
閱讀下一行 /<!-- this is token 2 -->/q
如果它是結束標記,請退出 \\|GUI/LastVMSelected|
-如果該行與字符串匹配
s/value="\\([^"]*\\)"/\\1/p
在'value ='之后和下一個引號之前打印字符串 ba
標記為“ a”的分支 }
結束,如果
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.