簡體   English   中英

如何使用bash腳本從令牌之間的文件文本中提取

[英]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'

說明:

  • -n:禁止默認打印
  • / 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM