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