Tim*_*Tim 9 bash text-processing
我想将一个字符串拆分为多个子字符串,由一些分隔符(这也是一个字符串本身)分隔。
我怎样才能做到这一点
只使用 bash 吗?(极简主义,也是我的主要兴趣)
或者如果允许一些文本处理程序?(为了方便当程序可用时)
谢谢。
简单的例子,
1--123--23由--成1,123和23。 1?*123的?*进入1和123 cho*_*oba 14
纯 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' '?*'
Run Code Online (Sandbox Code Playgroud)
或者使用 Perl:
perl -E 'say for split quotemeta shift, shift' -- "$separator" "$string"
Run Code Online (Sandbox Code Playgroud)
只需使用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)
纯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='\*'
| 归档时间: |
|
| 查看次数: |
29543 次 |
| 最近记录: |