簡體   English   中英

捕獲兩個令牌之間的文本

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

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