Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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
我可以在sed中使用bash关联数组作为替换吗?_Bash_Sed - Fatal编程技术网

我可以在sed中使用bash关联数组作为替换吗?

我可以在sed中使用bash关联数组作为替换吗?,bash,sed,Bash,Sed,我在bash中定义了一个工作日名称数组,并希望使用sed替换工作日名称中包含的数值 数组的定义如下: declare -A DAYNAME=( ["1"]="Mon" ["2"]="Tue" ["3"]="Wed" ["4"]="Thu" ["5"]="Fri" ["6"]="Sat" ["7"]="Sun" ) 这是有效的: uwe@Caboto:~$ echo "Today is <5>" | sed -e "s/<\([1-7]\)>/\1/" Today is

我在bash中定义了一个工作日名称数组,并希望使用sed替换工作日名称中包含的数值

数组的定义如下:

declare -A DAYNAME=( ["1"]="Mon" ["2"]="Tue" ["3"]="Wed" ["4"]="Thu" ["5"]="Fri" ["6"]="Sat" ["7"]="Sun" )
这是有效的:

uwe@Caboto:~$ echo "Today is <5>" | sed -e "s/<\([1-7]\)>/\1/"
Today is 5
uwe@Caboto:~$echo“今天是”| sed-e“s/\1/”
今天是5点
这也在起作用:

uwe@Caboto:~$ echo "Today is <5>" | sed -e "s/<\([1-7]\)>/${DAYNAME[5]}/"
Today is Fri
uwe@Caboto:~$echo“今天是”| sed-e“s/${DAYNAME[5]}/”
今天是星期五
但是,这不起作用:

uwe@Caboto:~$ echo "Today is <5>" | sed -e "s/<\([1-7]\)>/${DAYNAME[\1]}/"
Today is Mon
uwe@Caboto:~$echo“今天是”| sed-e“s/${DAYNAME[\1]}/”
今天是星期一
我已经尝试了其他语法,但无法找到用DAYNAME中的值替换数字的方法


它不起作用有什么原因吗?

它不起作用的原因是,当您的反向引用
\1
扩展到其组成字符串时,使用字符串值的数组引用将变得太晚而无法检索。您可以使用变量的双重展开(例如使用eval)来逃避,这看起来不太好

如果要使用关联数组作为引用,而该数组是bash工具箱的“一部分”,那么也可以使用该工具箱中的regex功能

declare -A DAYNAME=( ["1"]="Mon" ["2"]="Tue" ["3"]="Wed" ["4"]="Thu" ["5"]="Fri" ["6"]="Sat" ["7"]="Sun" )
将regex定义为与日期匹配

str="Today is <5>"
re='^(.*)<([1-7])>$'
if [[ $str =~ $re ]]; then
    day="${DAYNAME[${BASH_REMATCH[2]}]}"
    pre="${BASH_REMATCH[1]}"
    printf '%s\n' "${pre}${day}"
fi