根据字符串Bash拆分字符串

  • 本文关键字:字符串 拆分 Bash bash
  • 更新时间 :
  • 英文 :


在python中,我会做一些简单的事情,比如sRet = sOut.split('Word')

在bash中,从其他答案中可以找到,我有以下两种方法在我的情况下是不够的,但可能对将来的人有用:

sOut="I want this Point to matter"
1)  sRet=( $sOut )
2)  IFS="Point " read -r -a sRet <<< ${sOut}
echo ${sRet[-1]}

我想要返回:"to matter"
(1) 给出:"matter"
(2) 给出:"er"

第一个只按空格分隔,第二个按最后一个字符分隔,在本例中为't'

如何像在python中那样用一个完整的字符串进行拆分?

sOut="I want this Point to matter"
s="Point "
[[ $sOut =~ $s(.*) ]] && echo ${BASH_REMATCH[1]}

输出:

重要的

IFS是单个字符,因此您需要部署另一个工具。在这种情况下,我建议awk

$ awk -F 'Point' '{print $NF}' <<< "$sOut"
 to matter

您可以将"Point"替换为包含分隔符的变量。您还可以更改返回拆分的哪一部分。变量$NF的意思是"最后一个元素"。您也可以将$1用于第一个元素,将$2用于第二个元素,依此类推

您可以使用awk来拆分字符串:

text="I want this Point to matter"
s='Point'
awk -v s="$s" -v text="$text" 'BEGIN {split(text, a, "[[:blank:]]*" s "[[:blank:]]*");
    for (i in a) print a[i]}'
I want this
to matter

只获得最后一场比赛:

awk -v s="$s" -v text="$text" 'BEGIN {n=split(text, a, "[[:blank:]]*" s "[[:blank:]]*"); print a[n]}'
to matter

或者:

awk -v s="$s" 'BEGIN{FS="[[:blank:]]*" s "[[:blank:]]*"} {print $NF}' <<< "$text"
to matter

IFS不适用于多个字符串。因此,IFS='Point'将分割每个字符Point的输出。

sDelim="Point"
sRet1=$(awk -F ${sDelim} '{print $1}' <<< ${sOut})
sRet2=$(awk -F ${sDelim} '{print $NF}' <<< ${sOut})

考虑到所有其他优秀的答案,我最喜欢这个,原因如下:
1) 短而甜
2) 当想要使用变量时,一切都相当明确
3) 可以选择任何元素:1,2,。。从一开始,NF,NF-1,。。从结尾
4) 如果sDelim实际上不在sOut中,则脚本不会使异常

主要感谢@bishop把我带到这个

您可以使用sed的括号功能来检索匹配的字符串。

以下代码:

sOut="I want this point to matter"
s="point "
echo $sOut | sed "s/.*$s(.*)/1/"

会给我:

to matter

作为输出。

最新更新