簡體   English   中英

bash數組的前綴和后綴元素

[英]Prefix and postfix elements of a bash array

我想在bash中預先修復一個數組,類似於大括號擴展。

說我有一個bash數組

ARRAY=( one two three )

我想能夠像下面的大括號擴展一樣預先修改它

echo prefix_{one,two,three}_suffix

我能找到的最好用的是使用bash regex來添加前綴或后綴

echo ${ARRAY[@]/#/prefix_}
echo ${ARRAY[@]/%/_suffix}

但我找不到任何關於如何同時做兩件事的事情。 我可能會使用正則表達式捕獲並執行類似的操作

echo ${ARRAY[@]/.*/prefix_$1_suffix}

但似乎bash變量正則表達式替換中不支持捕獲。 我還可以存儲一個臨時數組變量

PRE=(${ARRAY[@]/#/prefix_})
echo ${PRE[@]/%/_suffix}

這可能是我能想到的最好的,但它似乎仍然低於標准桿。 最后一種選擇是使用類似於的for循環

EXPANDED=""
for E in ${ARRAY[@]}; do
    EXPANDED="prefix_${E}_suffix $EXPANDED"
done
echo $EXPANDED

但這太丑了。 如果我想要前綴后綴或數組元素的空格,我也不知道如何讓它工作。

Bash大括號擴展不使用正則表達式。 使用的模式只是一些shell glob,你可以在bash手冊3.5.8.1模式匹配中找到它。

你的兩步解決方案很酷,但它需要一些空白安全的引用:

ARR_PRE=("${ARRAY[@]/#/prefix_}")
echo "${ARR_PRE[@]/%/_suffix}"

你也可以用邪惡的方式做到這一點:

eval "something $(printf 'pre_%q_suf ' "${ARRAY[@]}")"

您的上一個循環可以通過以空格友好的方式完成:

EXPANDED=()
for E in "${ARRAY[@]}"; do
    EXPANDED+=("prefix_${E}_suffix")
done
echo "${EXPANDED[@]}"

更漂亮但與循環解決方案基本相同:

$ ARRAY=(A B C)
$ mapfile -t -d $'\0' EXPANDED < <(printf "prefix_%s_postfix\0" "${ARRAY[@]}")
$ echo "${EXPANDED[@]}"
prefix_A_postfix prefix_B_postfix prefix_C_postfix

mapfile將行讀入數組的元素。 使用-d $'\\0'而不是讀取以null分隔的字符串,而-t從結果中省略分隔符。 請參閱help mapfile

對於數組:

ARRAY=( one two three )
(IFS=,; eval echo prefix_\{"${ARRAY[*]}"\}_suffix)

對於字符串:

STRING="one two three"
eval echo prefix_\{${STRING// /,}\}_suffix

eval導致其參數被評估兩次,在兩種情況下,第一次評估結果都是

echo prefix_{one,two,three}_suffix

第二次執行它。 對於數組情況,子shell用於避免覆蓋IFS

您也可以在zsh中執行此操作:

echo ${${ARRAY[@]/#/prefix_}/%/_suffix}

我有完全相同的問題,我使用sed的單詞邊界匹配機制提出以下解決方案:

myarray=( one two three )
newarray=( $(echo ${myarray[*]}|sed "s/\(\b[^ ]\+\)/pre-\1-post/g") )
echo ${newarray[@]}
> pre-one-post pre-two-post pre-three-post
echo ${#newarray[@]}
> 3

等待更優雅的解決方案......

暫無
暫無

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

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