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

时间:2017-07-11 04:39:12

标签: python regex bash split

我有这样一个字符串:

files = glob.glob('files/*.CSV')
dfs = [pd.read_csv(fp) for fp in files]
#win solution - double split
keys = [x.split('\\')[-1].split('.')[0] for x in files]
df = pd.concat(dfs, keys=keys)

现在我需要拆分msg='123abc456def' 并获得如下结果:

msg

在python中,我可以这样做:

['123', 'abc', '456', 'def']

如何在bash脚本中获得相同的结果?
我尝试过这样但是它不起作用:

pattern = re.compile(r'(\d+)')
res = pattern.split(msg)[1:]

3 个答案:

答案 0 :(得分:2)

使用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:]]+

答案 1 :(得分:2)

鉴于您已经知道如何在Python中解决这个问题,您可以使用问题中显示的代码解决它:

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

虽然python不像grepawk那样是可执行文件的标准,但这对您来说真的很重要吗?

答案 2 :(得分:1)

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

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