我想将一个字符串拆分为子字符串,并用一些分隔符分隔(这也是一个字符串本身)。
我怎样才能做到这一点
只使用bash? (为了极简主义,也是我的主要兴趣)
或者是否允许某些文本处理程序? (当程序可用时为方便起见)
谢谢。
简单的例子,
- 分成,和.
1--123--23
--
1
123
23
- 分成和
1?*123
?*
1
123
答案1
纯 bash 解决方案,使用IFS
和read
。请注意,字符串不应包含$'\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