Grep
遍歷字元串數組,將正則表達式應用於 Korn Shell 中的每個元素
我有一個字元串數組,稱為
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
格式字元串添加)。該程式碼將與
ksh93
、bash
、zsh
和一起使用yash
。