在 Bash 中按分隔符拆分字符串

在 Bash 中按分隔符拆分字符串
在 Bash 中按分隔符拆分字符串

分解 Bash 中的字符串操作

使用 shell 脚本时,一个常见的任务是根据分隔符分割字符串。例如,考虑一个包含用分号分隔的电子邮件地址的字符串。如果您需要单独处理每封电子邮件,那么了解如何拆分该字符串就变得至关重要。本文将指导您通过不同的方法在 Bash 中实现这一目标。

我们将探索解决方案,例如使用“tr”命令和操作内部字段分隔符(IFS)。最后,您将能够有效地处理字符串拆分并将 IFS 重置为其默认值。让我们深入研究并简化您的 Bash 脚本编写任务!

命令 描述
tr 翻译或删除字符。此处用于用换行符替换分号来分割字符串。
IFS 内部字段分隔符,用于根据 Bash 脚本中的特定分隔符分割字符串。
read -r -a 读取一行输入并将其拆分为一个数组。 -r 选项可防止反斜杠被解释为转义字符。
echo 将文本打印到标准输出。用于显示分割后的字符串元素。
split 一个 Perl 函数,根据指定的分隔符将字符串划分为字符串列表。
foreach 迭代值列表的 Perl 循环结构。

了解 Bash 字符串分割技术

第一个 Bash 脚本演示了如何使用 tr 命令。这里我们定义一个字符串 IN="bla@some.com;john@home.com" 并使用 echo 和这个结合 tr 将分号分隔符转换为换行符。这有效地将字符串分成单独的行。这 for 然后循环遍历每一行,打印方括号内的地址。这种方法很简单,利用了 Unix 命令强大的文本处理能力来操作字符串。

另一种方法涉及调整 Internal Field Separator (IFS)。通过临时设置 IFS 到分号,我们可以将字符串拆分成一个数组。我们保存原件 IFSOIFS 在修改它之前,确保我们以后可以恢复它。这 read -r -a 命令将输入​​字符串读取到名为的数组中 mails2,根据修改后的情况进行分割 IFS。处理后,原来的 IFS 已恢复。这种方法提供了一种更加编程化的方式来处理 Bash 中的字符串分割,使我们能够利用数组进行进一步的操作。

使用 Bash 按分隔符分割字符串

bash脚本

#!/usr/bin/env bash
# Input string
IN="bla@some.com;john@home.com"
# Split string using 'tr' and iterate
mails=$(echo $IN | tr ";" "\n")
for addr in $mails; do
  echo "> [$addr]"
done

# Output:
# > [bla@some.com]
# > [john@home.com]

使用 IFS 在 Bash 中分割字符串

bash脚本

#!/usr/bin/env bash
# Input string
IN="bla@some.com;john@home.com"
# Save the original IFS
OIFS=$IFS
# Set IFS to semicolon
IFS=';'
# Split string into an array
read -r -a mails2 <<< "$IN"
# Restore the original IFS
IFS=$OIFS
# Iterate over the array
for x in "${mails2[@]}"; do
  echo "> [$x]"
done

# Output:
# > [bla@some.com]
# > [john@home.com]

使用Python进行字符串分割

Python脚本

#!/usr/bin/env python3
# Input string
IN = "bla@some.com;john@home.com"
# Split string by semicolon
mails = IN.split(';')
# Iterate and print each element
for addr in mails:
    print(f"> [{addr}]")

# Output:
# > [bla@some.com]
# > [john@home.com]

使用 Perl 分割字符串

Perl脚本

#!/usr/bin/env perl
use strict;
use warnings;
# Input string
my $IN = "bla@some.com;john@home.com";
# Split string by semicolon
my @mails = split(';', $IN);
# Iterate and print each element
foreach my $addr (@mails) {
    print "> [$addr]\n";
}

# Output:
# > [bla@some.com]
# > [john@home.com]

Bash 中的高级字符串分割技术

在 Bash 中分割字符串的另一个强大方法是使用 awk 命令。 awk 是一个多功能的命令行实用程序,专为模式扫描和处理而设计。它对于分割字符串特别有用,因为它允许我们定义自定义字段分隔符。例如,我们可以使用 awk -F";" '{print $1, $2}' 根据分号分隔符分割字符串并打印各个组成部分。这种方法非常灵活,可以处理更复杂的字符串操作任务,使其成为 Bash 程序员工具包中的一个有价值的工具。

此外, cut 命令可用于根据分隔符分割字符串。这 cut 命令通常用于从每行输入数据中提取部分。通过指定分隔符 -d 选项并选择字段 -f 选项,我们可以有效地分割和提取字符串的一部分。例如,使用 echo $IN | cut -d';' -f1 将从输入字符串中提取第一个电子邮件地址。这些先进的方法为 Bash 中的字符串操作任务提供了更多的控制和精度。

有关 Bash 中字符串拆分的常见问题和解答

  1. 如何在 Bash 中按分隔符分割字符串?
  2. 您可以使用 IFS 变量或命令,例如 tr, awk, 和 cut 在分隔符上分割字符串。
  3. 是什么 IFS Bash 中的变量?
  4. IFS (内部字段分隔符)是一个特殊变量,它定义用于将输入文本拆分为单词或标记的字符。
  5. 我怎样才能重置 IFS 变量为其默认值?
  6. 保存原件 IFS 改变前的值,处理后恢复: OIFS=$IFS; IFS=';'; ... ; IFS=$OIFS
  7. 什么是 tr 命令在字符串分割中做什么?
  8. tr 命令翻译或删除字符。它可以用换行符替换分隔符来分割字符串: echo $IN | tr ";" "\n"
  9. 我可以使用 Bash 将字符串拆分为数组吗?
  10. 是的,通过改变 IFS 变量和使用 read -r -a,您可以将字符串拆分为数组: read -r -a array <<< "$string"
  11. 是什么 awk 命令用于?
  12. awk 是用于模式扫描和处理的命令行实用程序。它可以通过定义自定义字段分隔符来分割字符串。
  13. 如何 cut 指挥工作?
  14. cut 命令从每行输入中提取部分。它可以通过指定分隔符和选择字段来分割字符串: echo $string | cut -d';' -f1
  15. 为什么使用 IFS 对字符串分割有帮助吗?
  16. 使用 IFS 允许您定义用于分割字符串的自定义分隔符,使其适用于不同的输入格式。
  17. Bash 中是否可以用多个分隔符分割字符串?
  18. 是的,您可以组合使用 trawk 处理多个分隔符。
  19. 我可以用吗 sed Bash 中的字符串分割?
  20. 尽管 sed 主要是一个流编辑器,它可以与其他命令结合使用,例如 awk 间接分割字符串。

关于 Bash 中字符串分割的最终想法

掌握 Bash 中的字符串操作可以显着提高脚本编写效率。是否使用 IFS 对于简单的分隔符或更高级的工具,例如 trawk,这些技术对于有效的 Bash 编程至关重要。请记住始终恢复原始状态 IFS 以避免脚本中出现意外行为。使用这些方法,您可以在 Bash 脚本中处理各种字符串处理任务。