用bash中的某个分隔符分割字符串?

Tim*_*Tim 9 bash text-processing

我想将一个字符串拆分为多个子字符串,由一些分隔符(这也是一个字符串本身)分隔。

我怎样才能做到这一点

  • 只使用 bash 吗?(极简主义,也是我的主要兴趣)

  • 或者如果允许一些文本处理程序?(为了方便当程序可用时)

谢谢。

简单的例子,

  • 分割1--123--23--112323
  • 分裂1?*123?*进入1123

cho*_*oba 14

纯 bash 解决方案,使用IFSread. 请注意,字符串不应包含$'\2'(或您用于 IFS 的任何其他内容,不幸的$'\0'是不起作用,但例如$'\666'):

#!/bin/bash

split_by () {
    string=$1
    separator=$2

    tmp=${string//"$separator"/$'\2'}
    IFS=$'\2' read -a arr <<< "$tmp"
    for substr in "${arr[@]}" ; do
        echo "<$substr>"
    done
    echo
}


split_by '1--123--23' '--'
split_by '1?*123' '?*'
Run Code Online (Sandbox Code Playgroud)

或者使用 Perl:

perl -E 'say for split quotemeta shift, shift' -- "$separator" "$string"
Run Code Online (Sandbox Code Playgroud)


Rom*_*est 6

只需使用awk即可:

str="1--123--23"
awk -F'--' '{ for(i=1;i<=NF;i++) print $i }' <<< $str
Run Code Online (Sandbox Code Playgroud)

输出:

1
123
23
Run Code Online (Sandbox Code Playgroud)

另一个简短的Python解决方案:

splitter.py脚本:

import sys
print('\n'.join(sys.argv[2].split(sys.argv[1])))
Run Code Online (Sandbox Code Playgroud)

参数顺序:

  • sys.argv[0]- 脚本名称(即splitter.py

  • sys.argv[1]- 子字符串分隔符

  • sys.argv[2]- 输入字符串

用法:

python splitter.py "?*" "1?*123"
1
123
Run Code Online (Sandbox Code Playgroud)
python splitter.py "--" "1--23--123"
1
23
123
Run Code Online (Sandbox Code Playgroud)


Phi*_*pos 5

纯POSIX外壳:

string="1--123--23"
del="--"

while test "${string#*$del}" != "$string" ; do
  echo "${string%%$del*}"
  string="${string#*$del}"
done
echo "$string"
Run Code Online (Sandbox Code Playgroud)

注意*or?需要在分隔符中转义:del='\*'