在 bash 中用一些分隔符分割字符串?

在 bash 中用一些分隔符分割字符串?

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

我怎样才能做到这一点

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

  • 或者是否允许某些文本处理程序? (当程序可用时为方便起见)

谢谢。

简单的例子,

  • 分成,和. 1--123--23--112323
  • 分成和1?*123?*1123

答案1

纯 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' '?*'

或者使用 Perl:

perl -E 'say for split quotemeta shift, shift' -- "$separator" "$string"

答案2

简单地与awk

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

输出:

1
123
23

又一个短篇Python解决方案:

splitter.py脚本:

import sys
print('\n'.join(sys.argv[2].split(sys.argv[1])))

参数顺序:

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

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

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

用法:

python splitter.py "?*" "1?*123"
1
123

python splitter.py "--" "1--23--123"
1
23
123

答案3

纯 POSIX shell:

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

while test "${string#*$del}" != "$string" ; do
  echo "${string%%$del*}"
  string="${string#*$del}"
done
echo "$string"

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

答案4

与上面类似,但假设您只想获取 URI,例如:

URL="http://something.com/backup/v/photos/path/to/"
URI="./$(echo $URL | awk -F'.com/' '{print $2}')"
echo $URI

相关内容