我如何讓這個測驗只對 $trig_chars var 末尾的所有數字或字符(除了空格)為真?
示例:trig_chars='--'。匹配:--a --ab --abc --123。但不要匹配 --[space] (- 后跟一個空格)。
local compare_scan_text=${scan_text:0:$trig_chars_len}
if [[ "$compare_scan_text" =~ "$trig_chars"[^ ]* ]]; then # Trig char forward hit.
local l=${#hotstring}
local scan_text=${scan_text:$l} # Remove chars & hotscan_texts from scan_text.
local hotstring=${hotsring:$trig_chars_len} # Remove trig chars.
hotstrings =("$hotstring") # Update hotsrings list
fi
uj5u.com熱心網友回復:
示例輸入:
compare_scan_text="--a -- why -not ---me? --ab --abc --{xyz}"
- 使用 GNU grep:
grep -Po '(?<=^|\s)--[^\s-] ' <<< "$compare_scan_text"
- 使用 POSIX awk:
awk '{for (i = 1; i <= NF; i ) if ($i ~ /^--[^-]/) print $i}' <<< "$compare_scan_text"
輸出:
--a
--ab
--abc
--{xyz}
回復評論:
這里的grep解決方案僅適用于(幾乎)Linux,而awk一個適用于每個符合 POSIX 的作業系統(這意味著幾乎所有作業系統);所以我個人會選擇awk。
就開銷而言,一般來說,當呼叫外部命令時,您必須確保在回圈之外read使用它(而不是為回圈內的每一行呼叫它):
不要這樣做:
#!/bin/bash
hotstrings=()
while IFS='' read -r line
do
IFS=$'\n' read -r -d '' -a matches < <(
awk '{for (i = 1; i <= NF; i ) if ($i ~ /^--[^-]/) print $i}' <<< "$line"
)
hotstrings =( "${matches[@]}" )
done < file.txt
改為這樣做:
#!/bin/bash
# bash version < 4
IFS=$'\n' read -r -d '' -a hotstrings < <(
awk '{for (i = 1; i <= NF; i ) if ($i ~ /^--[^-]/) print $i}' < file.txt
)
# bash version >= 4
mapfile -t hotstrings < <(
awk '{for (i = 1; i <= NF; i ) if ($i ~ /^--[^-]/) print $i}' < file.txt
)
# bash version >= 4.3
readarray -d '' -t hotstrings < <(
awk '{for (i = 1; i <= NF; i ) if ($i ~ /^--[^-]/) printf "%s%c", $i, 0}' < file.txt
)
uj5u.com熱心網友回復:
if [[ $compare_scan_text =~ ^"$trig_chars"(.*[^ ]$|$) ]] ; then
即,如果最后一個字符不是空格,則 $trig_chars 可以后跟任何內容,或者它后面可以不跟任何內容。
通過參考變數,字符按字面意思解釋。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/412231.html
標籤:
