如何在Bash中切割字母数字字符串?寻求非sed/awk方案
不依赖sed/awk的字符串分割方案
针对你需要拆分的字符串格式(最后一个-分隔前缀和日期),这里提供几种不用sed、awk的实现方式:
方法1:Bash 内置参数扩展
利用bash自带的参数扩展就能轻松拆分,无需额外工具:
处理单个字符串
str="ABC-CDE-DEF-2023.03.14" a="${str%-*}" # 截取最后一个'-'之前的部分 b="${str##*-}" # 截取最后一个'-'之后的部分 echo "a=$a b=$b"
批量处理文件中的行
假设待处理的字符串每行一个,存在input.txt文件中:
while IFS= read -r line; do [ -z "$line" ] && continue a="${line%-*}" b="${line##*-}" echo "a=$a b=$b" done < input.txt
方法2:Python 单行/脚本实现
如果系统装有Python,用它的字符串拆分功能也很方便:
单行命令批量处理
python -c "import sys; [print(f'a={l.strip().rsplit(\"-\",1)[0]} b={l.strip().rsplit(\"-\",1)[1]}') for l in sys.stdin if l.strip()]" < input.txt
脚本形式(更易读)
with open('input.txt', 'r') as f: for line in f: line = line.strip() if not line: continue prefix, date = line.rsplit('-', 1) print(f"a={prefix} b={date}")
这里rsplit('-',1)表示从字符串右侧只做一次拆分,刚好把最后一个-作为分界点。
方法3:Perl 单行命令
Perl的正则拆分也能实现需求:
perl -ne 'chomp; next if /^\s*$/; ($a,$b) = split /-(?=[^-]+$)/; print "a=$a b=$b\n"' input.txt
正则-(?=[^-]+$)会匹配最后一个-(确保后面没有其他-),以此拆分出两部分。
内容的提问来源于stack exchange,提问作者love
相关产品推荐
相关产品推荐

