我正在嘗試在 shell 腳本中使用 regex 和 BASH_REMATCH 獲取每個字串的第一個字符。
我的輸入文本檔案包含:
config_text = STACK OVER FLOW
字串STACK OVER FLOW必須是大寫的。
我的輸出應該是這樣的:
SOF
我現在的代碼是:
var = config_text
values=$(grep $var test_file.txt | tr -s ' ' '\n' | cut -c 1)
if [[ $values =~ [=(.*)]]; then
echo $values
fi
如您所見,我正在使用tr和cut但我希望僅用BASH_REMATCH替換它們,因為這兩個命令已在許多鏈接中報告為在 MacO 上不起作用。
我試過這樣的事情:
var = config_text
values=$(grep $var test_file.txt)
if [[ $values =~ [=(.*)(\b[a-zA-Z])]]; then
echo $values
fi
我解釋的價值應該是:
S O F
但似乎 \b 不適用于 shell 腳本。任何人都知道如何僅使用BASH_REMATCH獲得我想要的輸出。提前感謝您的幫助。
uj5u.com熱心網友回復:
首先放置一個有效的shebang并將您的腳本粘貼到https://shellcheck.net以進行驗證/推薦。
假設該行以eg開頭config和結尾FLOW
config_text = STACK OVER FLOW
現在是腳本。
#!/usr/bin/env bash
values="config_text = STACK OVER FLOW"
regexp="config_text = ([[:upper:]]{1})[^ ] ([[:upper:]]{1})[^ ] ([[:upper:]]{1}). $"
while IFS= read -r line; do
[[ "$line" = "$values" && "$values" =~ $regexp ]] &&
printf '%s %s %s\n' "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
done < test_file.txt
如果只有一行或目標字串/模式在 的第一行,test_file.txt則while不需要回圈。
#!/usr/bin/env bash
values="config_text = STACK OVER FLOW"
regexp="config_text = ([[:upper:]]{1})[^ ] ([[:upper:]]{1})[^ ] ([[:upper:]]{1}). $"
IFS= read -r line < test_file.txt
[[ "$line" = "$values" && "$values" =~ $regexp ]] &&
printf '%s %s %s\n' "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
確保您擁有并運行/使用
Bashv4MacOS,默認為Bashv3請參閱如何逐行(和/或逐欄位)讀取檔案(資料流、變數)?
uj5u.com熱心網友回復:
處理任意數量的單詞和任何分隔符的通用 BASH_REMATCH 解決方案。
local input="STACK OVER FLOW" pattern='([[:upper:]] )([^[:upper:]]*)' result=""
while [[ $input =~ $pattern ]]; do
result ="${BASH_REMATCH[1]::1}${BASH_REMATCH[2]}"
input="${input:${#BASH_REMATCH[0]}}"
done
echo "$result"
# Output: "S O F"
uj5u.com熱心網友回復:
如果您不知道輸入字串中有多少個單詞,Bash 的正則運算式會有點麻煩。這又如何?
config_text="STACK OVER FLOW"
sed 's/\([^[:space:]]\)[^[:space:]]*/\1/g' <<<"$config_text"
uj5u.com熱心網友回復:
另一種選擇而不是 bash 正則運算式是利用 bash 引數擴展子字串${parameter:offset:length}來提取所需的字符:
$ read -ra arr <text.file ; printf "%s%s%s\n" "${arr[2]:0:1}" "${arr[3]:0:1}" "${arr[4]:0:1}"
SOF
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/531347.html
標籤:重击壳脚本
