Regex bash数组的前缀和后缀元素
我想在bash中对数组进行预修复和后缀修复,类似于大括号扩展 假设我有一个bash数组Regex bash数组的前缀和后缀元素,regex,arrays,bash,Regex,Arrays,Bash,我想在bash中对数组进行预修复和后缀修复,类似于大括号扩展 假设我有一个bash数组 ARRAY=( one two three ) 我希望能够像下面的大括号扩展一样对其进行预修复和后修复 echo prefix_{one,two,three}_suffix 我能找到的最好的方法是使用bash regex添加前缀或后缀 echo ${ARRAY[@]/#/prefix_} echo ${ARRAY[@]/%/_suffix} 但是我找不到任何关于如何同时做到这两个的方法。我可能会使用正则
ARRAY=( one two three )
我希望能够像下面的大括号扩展一样对其进行预修复和后修复
echo prefix_{one,two,three}_suffix
我能找到的最好的方法是使用bash regex添加前缀或后缀
echo ${ARRAY[@]/#/prefix_}
echo ${ARRAY[@]/%/_suffix}
但是我找不到任何关于如何同时做到这两个的方法。我可能会使用正则表达式捕获并执行以下操作
echo ${ARRAY[@]/.*/prefix_$1_suffix}
但在bash变量regex替换中似乎不支持捕获。我还可以存储一个临时数组变量,如
PRE=(${ARRAY[@]/#/prefix_})
echo ${PRE[@]/%/_suffix}
这可能是我所能想到的最好的,但它似乎仍然低于标准。最后一种选择是使用类似于的for循环
EXPANDED=""
for E in ${ARRAY[@]}; do
EXPANDED="prefix_${E}_suffix $EXPANDED"
done
echo $EXPANDED
但这太难看了。如果我想在前缀后缀或数组元素的任何位置使用空格,我也不知道如何使它工作。您的上一个循环可以通过以下方式以一种对空格友好的方式完成:
EXPANDED=()
for E in "${ARRAY[@]}"; do
EXPANDED+=("prefix_${E}_suffix")
done
echo "${EXPANDED[@]}"
对于阵列:
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}
Bash括号扩展不使用正则表达式。所使用的模式只是一些shell glob,可以在bash手册中找到 您的两步解决方案很酷,但它需要一些空白安全性方面的引用:
ARR_PRE=("${ARRAY[@]/#/prefix_}")
echo "${ARR_PRE[@]/%/_suffix}"
你也可以用一些邪恶的方式:
eval "something $(printf 'pre_%q_suf ' "${ARRAY[@]}")"
我有完全相同的问题,我使用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
等待更优雅的解决方案…更漂亮,但本质上与循环解决方案相同:
$ 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
$ARRAY=(A B C)
$mapfile-t-d$'\0'展开后<mapfile-d'
也会进行NUL终止。@usretc True,但是$'\0'
对readerYeah更具解释性。同样,实际上并不需要-t
,因为BASH
在变量中去除NUL
s,但这是一个工件。注意:如果使用IFS=$'\n'(用空格处理名称),那么prefix命令将不会保留原始数组结构。它只会使数组仅包含1项(字符串列表),并包含所有更改的字符串。如您随后运行时所示:declare-p array
。运行suffix命令时,它只会将其添加到列表中的最后一项。@Magne No它在任何地方都不依赖IFS。你到底从哪里得到这个想法的?试试看:IFS=''ARRAY=(p$'\nq''rs');ARR_PRE=(“${ARRAY[@]/#/prefix_}”);ARR_POS=(“${ARR_PRE[@]/%/_后缀}”);声明-p ARR_POS
。即使printfone也不会被破坏。如果您在注释的示例代码中设置IFS=$'\n'
,您就会明白我的意思。它输出:declare-a ARR_POS='([0]=“prefix_p prefix_q prefix_r s_后缀”)
@Magne Holy-effing-shite。如果IFS是\r
,\t
,\f
,甚至是\a
,它也会中断。它发生在Bash3.2.57(1)(苹果)上,但不是在5.0.17(1)上。我想那是你刚刚碰到的一个老巴什错误。。。