如何根据shell脚本中的模式拆分字符串并存储到数组中

时间:2016-02-12 16:53:18

标签: bash shell unix

我有一个像

这样的字符串
string = ionworldionfriendsionPeople

如何根据模式离子将其拆分并存储到数组中

array[0]=ionworld
array[1]=ionfriends
array[2]=ionPeople

我尝试了IFS,但我无法正确分割。任何人都可以帮忙解决这个问题。

编辑: 我试过了

test=ionworldionfriendsionPeople

IFS='ion' read -ra array <<< "$test"

此外,我的字符串有时可能包含

之类的空格
string = ionwo rldionfri endsionPeo ple

4 个答案:

答案 0 :(得分:3)

您可以使用一些POSIX参数扩展运算符以相反的顺序构建数组。

foo=ionworldionfriendsionPeople
tmp="$foo"
while [[ -n $tmp ]]; do
    # tail is set to the result of dropping the shortest suffix
    # matching ion*
    tail=${tmp%ion*}
    # Drop everything from tmp matching the tail, then prepend
    # the result to the array
    array=("${tmp#$tail}" "${array[@]}")
    # Repeat with the tail, until its empty
    tmp="$tail"
done

结果是

$ printf '%s\n' "${array[@]}"
ionworld
ionfriends
ionPeople

答案 1 :(得分:1)

grep -oP前瞻性正则表达式

一起使用
s='ionworldionfriendsionPeople'
grep -oP 'ion.*?(?=ion|$)' <<< "$s"

会给出输出:

ionworld
ionfriends
ionPeople

填充数组:

arr=()
while read -r; do
   arr+=("$REPLY")
done < <(grep -oP 'ion.*?(?=ion|$)' <<< "$s")

检查数组内容:

declare -p arr
declare -a arr='([0]="ionworld" [1]="ionfriends" [2]="ionPeople")'

如果您的grep不支持-P(PCRE),那么您可以使用此gnu-awk:

awk -v RS='ion' 'RT{p=RT} $1!=""{print p $1}' <<< "$s"

<强>输出:

ionworld
ionfriends
ionPeople

答案 2 :(得分:1)

如果输入字符串从不包含空格,则可以使用参数扩展:

@DiscriminatorValue

如果字符串包含空格,请找到另一个字符并使用它:

#! /bin/bash
string=ionworldionfriendsionPeople
array=(${string//ion/ })
for m in "${array[@]}" ; do
    echo ion"$m"
done

但是你需要跳过数组中第一个空的元素。

答案 3 :(得分:1)

$arr = array(
    "a",
    "1.34.163.57",
    "1.64.131.242",
    "1.123.153.166",
    "1.209.122.55"
);

echo (in_array('1.34.163.57', $arr)) ? "YES" : "NO";