簡體   English   中英

在bash中找到模式的第4次出現后獲取所有字符串

[英]Get all strings after the 4th occurrence of the pattern is found in bash

以類似以下的字符串開頭:

String=1973251922:197325192278:abcdefgh:0xfff689990:Searching done for the string:SUCCESS.

需要一個正則表達式,用於匹配第四個冒號“:”之后的所有字符串,並將其分配給shell腳本中的變量,例如:

var_result="Searching done for the string:SUCCESS."

使用外殼(bash或POSIX)

$ string="1973251922:197325192278:abcdefgh:0xfff689990:Searching done for the string:SUCCESS."
$ echo "${string#*:*:*:*:}"
Searching done for the string:SUCCESS.

${string#*:*:*:*:}前綴刪除的示例。 它刪除由四個冒號分隔的字符串組成的前綴。

輸出可以保存在shell變量中:

$ var_result=${string#*:*:*:*:}
$ echo "$var_result"
Searching done for the string:SUCCESS.

使用切

cut為此:

$ string="1973251922:197325192278:abcdefgh:0xfff689990:Searching done for the string:SUCCESS."
$ cut -d: -f 5- <<<"$string"
Searching done for the string:SUCCESS.

上面選擇了第五個字段和所有后續字段,其中所有字段之間都用冒號分隔。 更具體地說, -d:告訴cut使用:作為字段分隔符, -f 5-告訴它選擇字段5及其之后的所有內容。

要將輸出保存在變量中,我們使用命令替換

$ var_result=$(cut -d: -f 5- <<<"$var")
$ echo "$var_result"
Searching done for the string:SUCCESS.

如果您只有POSIX Shell,而沒有bash,則需要使用echo

$ var_result=$(echo "$var" | cut -d: -f 5-)
$ echo "$var_result"
Searching done for the string:SUCCESS.

或者,更安全的是printf

$ var_result=$(printf "%s" "$var" | cut -d: -f 5-)
$ echo "$var_result"
Searching done for the string:SUCCESS.

使用sed

以下使用sed刪除冒號定義的前四個字段:

$ sed -E 's/([^:]*:){4}//' <<<"$string"
Searching done for the string:SUCCESS.

進一步來說:

  • [^:]匹配除:以外的任何字符。

  • [^:]*:匹配任意數量的非冒號,后跟冒號。

  • ([^:]*:){4}完全匹配四個冒號分隔的字段。

  • s/([^:]*:){4}//是一個替代命令,該命令查找前四個用冒號分隔的列,並將它們替換為空字符串。

以下是相同的,但是將結果保存在變量中:

$ var_result=$(sed -E 's/([^:]*:){4}//' <<<"$string")
$ echo "$var_result"
Searching done for the string:SUCCESS.

以下是相同的,但對於POSIX shell也有好處:

$ var_result=$(printf '%s' "$var" | sed -E 's/([^:]*:){4}//')
$ echo "$var_result"
Searching done for the string:SUCCESS.

以下解決方案可能對您有所幫助。 假設以下是變量的值:

var="1973251922:197325192278:abcdefgh:0xfff689990:Searching done for the string:SUCCESS."
echo "$var"
1973251922:197325192278:abcdefgh:0xfff689990:Searching done for the string:SUCCESS.

echo "$var" | awk -F":" '{$1=$2=$3=$4="";sub(/^:+/,"");print $0}' OFS=":"
Searching done for the string:SUCCESS.

使用bash regex,您可以說:

String="1973251922:197325192278:abcdefgh:0xfff689990:Searching done for the string:SUCCESS."

if [[ $String =~ ^([^:]*:){4}(.+)$ ]]; then
    echo ${BASH_REMATCH[2]}
fi

暫無
暫無

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

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