我有这样一个字符串:
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:]
答案 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
[[:digit:]]+|[^[:digit:]]+
匹配一个或多个数字([[:digit:]]+
)或(|
)一个或多个非数字([^[:digit:]]+
。答案 1 :(得分:2)
鉴于您已经知道如何在Python中解决这个问题,您可以使用问题中显示的代码解决它:
MSG=123abc456def;
python -c "import re; print('\n'.join(re.split(r'(\\d+)', '${MSG}')[1:]))"
虽然python
不像grep
或awk
那样是可执行文件的标准,但这对您来说真的很重要吗?
答案 2 :(得分:1)
我会做匹配而不是分裂。在这里,我使用了grep
但你也可以在纯bash中使用相同的正则表达式。
$ msg='123abc456def'
$ grep -oE '[0-9]+|[^0-9]+' <<<$msg
123
abc
456
def