如何在Bash脚本中根据正则表达式拆分字符串

5

我有这样一个字符串:

msg='123abc456def'

现在我需要分割msg并获得以下结果:
['123', 'abc', '456', 'def']

在Python中,我可以像这样做:
pattern = re.compile(r'(\d+)')
res = pattern.split(msg)[1:]

如何在bash脚本中获得相同的结果?我已经尝试过这样,但是它不能正常工作:
IFS='[0-9]'    # how to define IFS with regex?
echo ${msg[@]}

为什么不直接调用你的Python脚本呢? - Mad Physicist
3个回答

8

使用 grep 获取子字符串,并使用命令替换将输出放在数组中:

$ msg='123abc456def'

$ out=( $(grep -Eo '[[:digit:]]+|[^[:digit:]]+' <<<"$msg") )

$ echo "${out[0]}"
123

$ echo "${out[1]}"
abc

$ echo "${out[@]}"
123 abc 456 def
  • 正则表达式(ERE)模式[[:digit:]]+|[^[:digit:]]+匹配一个或多个数字([[:digit:]]+) 或(|)一个或多个非数字([^[:digit:]]+)。

4

假设您已经知道如何在Python中解决此问题,您可以使用问题中显示的代码来解决它:

MSG=123abc456def;
python -c "import re; print('\n'.join(re.split(r'(\\d+)', '${MSG}')[1:]))"

Python虽然不像grepawk那样标准,但这对你来说真的重要吗?


谢谢!当我从Bash管道中获得一个字符串列表(每个字符串在新行中)时,我可以在Bash脚本中使用它吗? - Porcupine
@Nikhil,请提出一个新的具体问题。如果您需要我的帮助,请随时联系我。 - Mad Physicist

3

我建议使用匹配而不是分割。这里我使用了grep,但你也可以在纯bash中使用相同的正则表达式。

$ msg='123abc456def'
$ grep -oE '[0-9]+|[^0-9]+' <<<$msg
123
abc
456
def

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接