[英]Capture text between two tokens
我試圖在兩個令牌之間獲取文本。
例如,假設文本是:
arn:aws:dfasdfasdf/asdfa:start:CaptureThis/end
輸出應該是: CaptureThis
這兩個令牌是:start:
和/end
我能得到的最接近的是使用這個正則表達式 :
INPUT="arn:aws:dfasdfasdf/asdfa:start:CaptureThis/end"
VALUE=$(echo "${INPUT}" | sed -e 's/:start:\(.*\)\/end/\1/')
...但是這會返回大部分字符串: arn:aws:dfasdfasdf/asdfa:start:CaptureThis/end
如何將所有其他文本排除在外?
你可以使用(GNU)grep和Perl正則表達式(look-arounds)和-o
選項來只返回匹配:
$ grep -Po '(?<=:start:).*(?=/end)' <<< 'arn:aws:dfasdfasdf/asdfa:start:CaptureThis/end'
CaptureThis
嘗試這個:
$ sed 's/^.*:start:\(.*\)\/end.*$/\1/' <<<'arn:aws:dfasdfasdf/asdfa:start:CaptureThis/end'
CaptureThis
你的方法的問題是你只替換了部分輸入行,因為你的正則表達式沒有捕獲整行。
注意上面的命令如何在行的開頭( ^.*
)和結尾( .*$
)處錨定正則表達式,以確保整個行匹配並因此被替換。
你可以使用:
VALUE=$(echo "${INPUT}" | sed -e 's/.*:start:\(.*\)\/end.*/\1/')
如果令牌易於改變,你可以使用變量 - 但由於“/ end”有一個“/”,這可能導致sed變得混亂,所以你可能想要將它的分隔符更改為一些非沖突的字符(像“?”),所以:
TOKEN1=":start:"
TOKEN2="/end"
VALUE=$(echo "${INPUT}" | sed -e "s?.*$TOKEN1\(.*\)$TOKEN2.*?\1?")
不需要任何外部實用程序,bash 參數擴展將為您處理所有內容:
INPUT="arn:aws:dfasdfasdf/asdfa:start:CaptureThis/end"
token=${INPUT##*:}
echo ${token%/*}
產量
CaptureThis
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.