Grep

遍歷字元串數組,將正則表達式應用於 Korn Shell 中的每個元素

  • November 5, 2019

我有一個字元串數組,稱為names包含名稱和一些後續垃圾數據。像這樣

Jill Shortz, City Contractor, America
Bill Torts, Family Doctor, Canada
Will Courtz, Folk DJ, Bulgaria
Phil-Lip Warts, Juggler, India

我想通過names使用正則表達式僅提取前兩個單詞(^\w+-*( *\w+)*)並將它們覆蓋回進行迭代,names以便包含

Jill Shortz
Bill Torts
Will Courtz
Phil-Lip Warts

這就是我嘗試的方式,但我的 AIX 機器不喜歡-P在 Perl 模式下執行的參數

for((i=0;i<${#names[@]};++i)); do
       names[$i]=`grep -P '(^\w+-*( *\w+)*)' -o <<<"${names[i]}"`
done

我在 ksh 手冊頁中看不到任何地方可以將字元串與正則表達式匹配,並使用擷取括號來提取子字元串(就像你在 bash 中所做的那樣

[[ $str =~ ^([[:alnum:]]+([ -]+[[:alnum:]]+)+) ]] && echo "${BASH_REMATCH[1]}"

但是,您可以在全域模式中使用擴展正則表達式 with ~(E:regex),因此您可以這樣做:

for n in "${names[@]}"; do
 # remove the pattern from the start of the string
 tmp=${n##~(E:\w+([ -]+\w+)*)}
 # and then remove what remained from the end of the string
 echo "[${n%$tmp}]"
done
[Jill Shortz]
[Bill Torts]
[Will Courtz]
[Phil-Lip Warts]

…以及最大程度的只寫不可讀性

for n in "${names[@]}"; do
 echo "${n%${n##~(E:\w+([ -]+\w+)*)}}"
done

假設您只想刪除第一個逗號後的所有內容,我根本看不到使用正則表達式來完成此任務。

names=( "${names[@]%%,*}" )
printf '"%s"\n' "${names[@]}"

這是從每個數組元素中單獨刪除第一個逗號和它之後的所有內容(字面意思是“匹配萬用字元模式的最長後綴,*”)。然後將生成的修改名稱列表重新分配給names數組(並用 列印printf)。

鑑於您將數組初始化為問題中的列表,該程式碼將生成

"Jill Shortz"
"Bill Torts"
"Will Courtz"
"Phil-Lip Warts"

(雙引號由printf格式字元串添加)。

該程式碼將與ksh93bashzsh和一起使用yash

引用自:https://unix.stackexchange.com/questions/550512