簡體   English   中英

Bash提取兩個模式之間的字符串

[英]Bash extract string between two patterns

我有一個包含三種行的文件:

[       ]   APPLE
[ORANGE ] * ORANGE      on XXXXXXXXXXXXXXX
[YELLOW ] + BANANA      on XXXXXXXXXXXXXXX

我現在想做的是提取水果名稱,如下所示:

APPLE
ORANGE
BANANA

我試着用echo ${line:start:end}提取它,然后才意識到行的長度可能會有所不同。 所以我想我必須通過模式匹配來做到這一點。

我是bash的新手,應該如何用sed / awk或其他任何方式提取水果名稱?

謝謝!

嘗試使用此sed

sed 's/^\[....\] . \([A-Za-z0-9]*\).*/\1/' file

grep與擴展的正則表達式-E-o標志一起使用以僅返回匹配的位

grep -o -E 'SERVICE[_0-9A-Za-z]+' file

+將確保仍返回大於9的數字

編輯以匹配有問題的更改

這處理了兩個單詞的水果名稱,例如“陽桃”,但必須假定結尾的垃圾(如果有)以“ on”開頭(即“ XXXXXX”上的那些)。 它還假定水果名稱在第一個左方括號(“]”)之后開始:

sed -e 's/^[^]]*][^A-Za-z]*//' -e 's/\bon\b.*$//'  -e 's/\s*$//' your_file

說明:

-e 's/^[^]]*][^A-Za-z]*//' :從開始到第一個“]”,第一個“]”以及第一個后的所有非字母都刪除任何內容“]”。

-e 's/\\bon\\b.*$//' :刪除整個單詞“ on”直到行尾(如果存在)。

-e 's/\\s*$//' :在上述處理之后,刪除所有尾隨空格。

您可以將此awk與自定義字段分隔符結合使用來獲取值:

awk -F '\\[[^]]+\\][ *+]+| *on *' '{print $2}' file
APPLE
ORANGE
BANANA

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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