Bash根据字符串

时间:2015-12-07 14:58:53

标签: 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中一样?

5 个答案:

答案 0 :(得分:3)

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

输出:

to matter

答案 1 :(得分:2)

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

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

您可以使用包含分隔符的变量替换“Point”。您还可以更改返回的拆分部分。变量$NF表示“最后一个元素”。您也可以使用$1作为第一个元素,$2作为第二个元素,依此类推。

答案 2 :(得分:1)

您可以使用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的输出拆分。

答案 3 :(得分:1)

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带领我这个

答案 4 :(得分:-1)

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

以下代码:

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

会给我:

to matter

作为输出。