Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex bash数组的前缀和后缀元素_Regex_Arrays_Bash - Fatal编程技术网

Regex 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} 但是我找不到任何关于如何同时做到这两个的方法。我可能会使用正则

我想在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变量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)上。我想那是你刚刚碰到的一个老巴什错误。。。