百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

在Bash中按分隔符拆分字符串的方法

wptr33 2025-07-03 20:22 5 浏览

技术背景

在Bash脚本编程中,经常会遇到需要按特定分隔符拆分字符串的需求,例如处理CSV文件、解析日志等。掌握字符串拆分的方法对于数据处理和脚本自动化非常重要。

实现步骤

方法一:使用IFS和read命令

可以设置内部字段分隔符(IFS)变量,然后让它解析成一个数组。

示例代码:

IN="bla@some.com;john@home.com"
IFS=';' read -ra ADDR <<< "$IN"
for i in "${ADDR[@]}"; do
    # process "$i"
    echo "$i"
done

上述代码首先将IFS设置为分号,然后使用read -ra将输入字符串按分号拆分成数组ADDR,最后通过循环遍历数组元素。

方法二:使用Parameter Expansion

通过替换字符串中的分隔符为空格,然后将其解释为数组。

示例代码:

IN="bla@some.com;john@home.com"
arrIN=(${IN//;/ })
echo ${arrIN[1]}  # Output: john@home.com

这里使用了参数扩展语法,将字符串IN中的所有分号替换为空格,然后将结果存储在数组arrIN中。

方法三:使用cut命令

cut命令可以用于从字符串中提取特定字段。

示例代码:

echo "bla@some.com;john@home.com" | cut -d ";" -f 1
echo "bla@some.com;john@home.com" | cut -d ";" -f 2

该命令通过-d指定分隔符,-f指定要提取的字段。

方法四:使用tr命令

tr命令可以用于字符替换,将分隔符替换为换行符,然后逐行处理。

示例代码:

IN="bla@some.com;john@home.com"
for i in $(echo $IN | tr ";" "\n")
do
    # process
    echo "$i"
done

方法五:使用mapfile命令(Bash >= 4.4)

mapfile命令可以将输入按指定分隔符拆分成数组。

示例代码:

IN="bla@some.com;john@home.com"
mapfile -td \; fields <<<"$IN"
fields[-1]=${fields[-1]%#39;\n'}  # drop '\n' added on last field, by '<<<'
for x in "${fields[@]}"; do
    echo "> [$x]"
done

方法六:适用于多种shell的通用方法

使用字符串替换语法提取子字符串。

示例代码:

IN="bla@some.com;john@home.com;Full Name <fulnam@other.org>"
while [ "$IN" != "$iter" ]; do
    # extract the substring from start of string up to delimiter.
    iter=${IN%%;*}
    # delete this first "element" AND his separator, from $IN.
    IN="${IN#$iter;}"
    # Print (or doing anything with) the first "element".
    printf '> [%s]\n' "$iter"
done

核心代码

以下是一些核心代码示例总结:

# 使用IFS和read
IFS=';' read -ra ADDR <<< "$IN"
for i in "${ADDR[@]}"; do
    echo "$i"
done

# 使用Parameter Expansion
arrIN=(${IN//;/ })
echo ${arrIN[1]}

# 使用cut
echo "bla@some.com;john@home.com" | cut -d ";" -f 1

# 使用tr
for i in $(echo $IN | tr ";" "\n"); do
    echo "$i"
done

# 使用mapfile (Bash >= 4.4)
mapfile -td \; fields <<<"$IN"
fields[-1]=${fields[-1]%#39;\n'}
for x in "${fields[@]}"; do
    echo "> [$x]"
done

# 通用方法
while [ "$IN" != "$iter" ]; do
    iter=${IN%%;*}
    IN="${IN#$iter;}"
    printf '> [%s]\n' "$iter"
done

最佳实践

  • 当字符串中不包含空格时,可以使用Parameter Expansion方法,代码简洁。
  • 如果需要处理大文件的字段提取,优先使用cut命令。
  • 对于Bash 4.4及以上版本,mapfile命令是一个高效且功能强大的选择。
  • 当需要编写跨多种shell的脚本时,使用通用的字符串替换方法。

常见问题

1. 字符串包含空格

如果原始字符串包含空格,需要正确设置IFS。

IFS=':'; arrIN=($IN); unset IFS;

2. 分隔符是换行符

当分隔符是换行符时,可以这样设置IFS:

IFS=#39;\n'; arrIN=($IN); unset IFS;

3. 性能问题

使用cut命令时,如果需要重复提取字段,会产生大量的fork操作,性能较低。可以比较不同方法的执行时间,选择合适的方法。例如:

splitByCut() {
    local i=1
    while iter=$(echo "$1"|cut -d\; -f$i) ; [ -n "$iter" ]; do
        printf '> [%s]\n' "$iter"
        i=$((i+1))
    done
}

splitByMapFile() {
    iterMF() {
        local seq=$1 dest="${2%#39;\n'}"
        [[ $2 ]] && printf "> [%s]\n" "$dest"
    }
    mapfile <<<"${1//;/#39;\n'}" -tc 1 -C iterMF
}

IN="bla@some.com;john@home.com;Full Name <fulnam@other.org>"
printf -v in40 %333s
in40=${in40// /$IN;}
in40=${in40%;}

start=${EPOCHREALTIME/.};splitByMapFile "$in40" | md5sum;elap=00000$((${EPOCHREALTIME/.}-start))
printf 'Elapsed: %.4f secs.\n' ${elap::-6}.${elap: -6}

start=${EPOCHREALTIME/.};splitByCut "$in40" | md5sum;elap=00000$((${EPOCHREALTIME/.}-start))
printf 'Elapsed: %.4f secs.\n' ${elap::-6}.${elap: -6}

通过比较可以发现,mapfile方法的性能明显优于cut方法。

相关推荐

「网络安全」JAVA代码审计——XXE外部实体注入

一、WEB安全部分想要了解XXE,在那之前需要了解XML的相关基础二、XML基础...

Web前端面试题目及答案汇总(web前端面试题最新)

Web前端面试题目及答案汇总来源:极客头条以下是收集一些面试中经常会遇到的经典面试题以及自己面试过程中无法解决的问题,通过对知识的整理以及经验的总结,重新巩固自身的前端基础知识,如有错误或更好的答案,...

什么是脚本文件?与可执行文件有什么不同?

今天的内容是脚本文件和可执行文件是两种不同类型的计算机文件,它们在结构和执行方式上有显著区别。脚本文件:定义与特性...

20个实用Python运维脚本(收藏级)(python 运维工具)

系统环境:支持Linux(Ubuntu/CentOS/Debian)和Windows...

2026年前每个开发者都应该学习的技能

优秀开发者...

Linux 如何每 5、10、15 或 30 分钟运行一次 Cron 作业?

在Linux系统中,Cron是一个强大的工具,用于自动化重复性任务。通过合理配置...

Shell脚本编程进阶实战:从入门到高效自动化

Shell脚本编程进阶实战:从入门到高效自动化一、参数处理进阶:打造专业级CLI工具1.高级参数解析示例...

在Bash中按分隔符拆分字符串的方法

技术背景在Bash脚本编程中,经常会遇到需要按特定分隔符拆分字符串的需求,例如处理CSV文件、解析日志等。掌握字符串拆分的方法对于数据处理和脚本自动化非常重要。...

程序员用5分钟,把一个400多MB的苹果安装包削掉了187MB

丰色发自凹非寺量子位|公众号QbitAI前些日子,一个...

如何在 Windows 上编写批处理脚本

你知道如何使用命令提示符吗?如果这样做,您可以编写一个批处理文件。在最简单的形式中,批处理文件(或批处理脚本)是双击文件时执行的几个命令的列表。批处理文件一直回到DOS,但仍然适用于现代版本的Win...

一文搞懂shell脚本(shell脚本应用实战)

一文搞懂shell脚本1、shell脚本介绍什么是shell脚本...

一文讲清ShellScript脚本编程知识

摘要:本文详尽地讲述了ShellScript的基础内容,还有它在Linux系统里的运用情况,涵盖了它的基本语法、常用的命令以及高级的功能。ShellScript可是一种简单又非常实用的编...

在Bash脚本中获取自身所在目录的方法

技术背景在使用Bash脚本时,有时需要获取脚本自身所在的目录。比如,当脚本作为另一个应用程序的启动器时,需要将工作目录更改为脚本所在的目录,以便对该目录中的文件进行操作。然而,由于脚本的调用方式多样(...

shell中如何确定脚本的位置?这篇文章告诉你

我想从同一个位置读取一些配置文件,如何确定脚本的位置?。这个问题的出现主要是由两个原因引发的:一是您希望将脚本的数据或配置进行外部化,因此需要一种方式来寻找这些外部资源;二是您的脚本需要对某些捆绑资源...

bash shell 语法(bash命令用法)

下面是**Shell(Bash)语法的常用知识点总结**,适合初学者和日常脚本编写参考。内容涵盖变量、判断、循环、函数、重定向、正则、数组等常见用法。---#Shell(Bash)语法速查总结...