You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用grep和sed提取含连字符ISBN的文本数据行?

解决带连字符ISBN的提取问题

方案1:改进现有grep+sed命令

调整grep的正则规则,让它支持数字间插入连字符的ISBN格式,确保匹配的是完整的13位数字(含分隔连字符):

grep -oP "(?<!\d)\d(?:-?\d){12}(?!\d)" SourceDataFile.txt | sed -e "s/^[ \t]*//" | sed "s/\t/|/g" > Temp.csv

规则说明:

  • (?<!\d):避免从长数字串里截取部分内容,确保ISBN开头前不是数字
  • \d(?:-?\d){12}:匹配1个起始数字,后面跟着12组「可选连字符+数字」,刚好凑够13位有效数字,连字符可出现在任意数字之间
  • (?!\d):确保ISBN结尾后不是数字,避免匹配不完整的ISBN片段

方案2:更简洁的awk单命令

用awk一步完成匹配、去前导空白、制表符替换,无需多管道串联:

awk '{
    while(match($0, /(?<!\d)\d(?:-?\d){12}(?!\d)/, arr)) {
        isbn = arr[0]
        gsub(/^[ \t]+/, "", isbn)
        gsub(/\t/, "|", isbn)
        print isbn
        $0 = substr($0, RSTART + RLENGTH)
    }
}' SourceDataFile.txt > Temp.csv

简化版(如果每行最多1个ISBN):

awk '/(?<!\d)\d(?:-?\d){12}(?!\d)/ {
    isbn = gensub(/.*(?<!\d)(\d(?:-?\d){12})(?!\d).*/, "\\1", 1)
    gsub(/^[ \t]+/, "", isbn)
    gsub(/\t/, "|", isbn)
    print isbn
}' SourceDataFile.txt > Temp.csv

内容的提问来源于stack exchange,提问作者Donald Alexandre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:14:55