gpt4 book ai didi

regex - 纯 Bash 替换捕获组

转载 作者:行者123 更新时间:2023-11-29 09:12:49 26 4
gpt4 key购买 nike

我有这个示例字符串:

test_string="13A6"

这个字符/数字可以是从 0 到 9 和从 A 到 F。

我想要这个输出:

1 3 A 6

我有这个工作:

result=$(echo ${test_string} | sed 's/./& /g')

我想在没有 sed 的情况下完成它...我有另一个我不太喜欢的解决方案...很脏 :S

[[ ${test_string} =~ ^([0-9A-F])([0-9A-F])([0-9A-F])([0-9A-F]) ]] && result="${BASH_REMATCH[1]} ${BASH_REMATCH[2]} ${BASH_REMATCH[3]} ${BASH_REMATCH[4]}"

如果可能的话,我想使用语法为 result=${variable//pattern/replacement} 的纯 bash,但不确定如何像 sed 中的“&”那样引用匹配的在这种纯 bash 语法上使用 char 本身。任何bash大师? :)

最佳答案

这个怎么样(没有调用外部实用程序):

str="13A6"
[[ $str =~ ${str//?/(.)} ]]
printf '%s\n' "${BASH_REMATCH[*]:1}"

结果(没有尾随空格):

"1 3 A 6"

或者,如果您需要使用不同的分隔符:

[[ $str =~ ${str//?/(.)} ]]
( IFS=$'\n'; printf "%s\n" "${BASH_REMATCH[*]:1}")

或者,在函数中,IFS 可能是函数的局部:

divide(){ 
[[ $1 =~ ${1//?/(.)} ]]
local IFS=${2:-' '}
printf '%s\n' "${BASH_REMATCH[*]:1}"
}

divide "13A6" "-" # will output 1-3-A-6 in this example.

它是这样工作的:

           ${str//?/(.)}              # Replace each character with "(.)".  
[[ $str =~ ]] # Match the regex "(.)(.)(.) … …"
# capturing each character matched
# in the array "${BASH_REMATCH[@]}"

printf '%s\n' "${BASH_REMATCH[*]:1}" # Forget array index 0 and
# convert the array to one string
# using the first character
# of "$IFS" as separator
# (no trailing separator).

感谢@chepner 建议将数组中的 @ 更改为 *。这避免了使用时间数组或位置参数的需要。

关于regex - 纯 Bash 替换捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40773834/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com