在 Bash 中拆分字符串

Fumbani Banda 2023年1月30日
  1. 在 Bash 中使用 tr 命令拆分字符串
  2. 在 Bash 中使用 IFS 拆分字符串
  3. 在 Bash 中使用 read 命令拆分字符串
  4. 在 Bash 中使用参数扩展拆分字符串
  5. 在 Bash 中使用 cut 命令拆分字符串
在 Bash 中拆分字符串

本教程演示了在 bash 中使用 tr 命令、IFSread 命令、参数扩展和 cut 命令在分隔符上拆分字符串。

在 Bash 中使用 tr 命令拆分字符串

tr 命令是 translate 的缩写形式。它从标准输入中翻译、删除和压缩字符,并将结果写入标准输出。

这是在命令行或 bash 脚本中操作文本的有用命令。可以去除重复字符,小写转大写,替换字符。

在下面的 bash 脚本中,echo 命令通过管道将字符串变量 $addrs 传送到 tr 命令,该命令在分隔符 - 上拆分字符串变量。一旦字符串被拆分,这些值就会分配给 IP 变量。

然后,for 循环遍历 $IP 变量并使用 echo 命令打印出所有值。

#!/usr/bin/env bash

addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"

IP=$(echo $addrs | tr "-" "\n")

for ip in $IP
do
    echo "$ip"
done

下面的输出显示 $addr 字符串变量已在分隔符 - 上拆分为 4 个单独的字符串。

192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4

在 Bash 中使用 IFS 拆分字符串

IFS 代表内部字段分隔符。

IFS 用于扩展后的单词拆分,并使用内置的 read 命令将行拆分为单词。IFS 的值告诉 shell 如何识别单词边界。

IFS 的默认值是一个空格、一个制表符和一个新行。在下面的脚本中,IFS 的原始值已存储在 OIFS 变量中,而新的 IFS 值已设置为 -

这意味着 shell 应该将 - 作为新词的边界。shell 在 - 上拆分字符串变量 addrs,并将新值分配给 ips 变量。

然后,for 循环遍历 $ips 变量并使用 echo 命令打印出所有值。

IFS=$OIFS 用于恢复 IFS 变量的原始值,并且 unset OIFS 告诉 shell 从它跟踪的变量列表中删除变量 OIFS

#!/usr/bin/env bash

addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"

OIFS=$IFS
IFS='-'

ips=$addrs
for ip in $ips
do
    echo "$ip"
done
IFS=$OIFS
unset OIFS

下面的输出显示 $addr 字符串变量已在分隔符 - 上拆分为 4 个单独的字符串。

192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4

在 Bash 中使用 read 命令拆分字符串

read 命令是 Linux 系统上的内置命令。

它用于将一行的内容读入变量。它还拆分分配给 shell 变量的字符串的单词。

变量 $addrs 字符串被传递给下面脚本中的 read 命令。IFS 设置作为字符串变量的单词边界的分隔符。

这意味着 - 在我们的例子中是单词边界。-a 选项告诉 read 命令将已拆分的单词存储到数组中,而 -r 选项告诉 read 命令按原样处理任何转义字符而不解释它们。

已拆分的单词存储在 IP 数组中。for 循环遍历 $IP 数组并使用 echo 命令打印出所有值。

#!/usr/bin/env bash

addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"


IFS='-' read -ra  IP <<< "$addrs"
for ip in "${IP[@]}";
do
    echo "$ip"
done

从下面的输出中,我们可以观察到 $addr 字符串变量已在分隔符 - 上拆分为单独的 4 个字符串。

192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4

在 Bash 中使用参数扩展拆分字符串

下面的脚本使用参数扩展来搜索和替换字符。用于参数扩展的语法是 ${variable//search/replace}。这将搜索与 variable 中的 search 匹配的模式,并将其替换为 replace

在我们的例子中,脚本搜索模式 - 并将其替换为空白。${addrs//-/ } 周围的括号用于定义新字符串的数组,称为 ip_array

我们使用 for 循环遍历所有 ip_array 变量元素并使用 echo 命令显示它们。

#!/usr/bin/env bash

addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"


ip_array=(${addrs//-/ })
for ip in "${ip_array[@]}"
do
    echo "$ip"
done

下面的输出显示了 ip_array 中的所有元素。

192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4

我们可以通过传入索引来访问 ip_array 变量的各个元素。在下面的脚本中,我们传递了索引 0 来引用数组中的第一个元素。

#!/usr/bin/env bash

addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"


ip_array=(${addrs//-/ })
printf "${ip_array[0]}\n"

输出显示 ip_array 的第一个元素。

192.168.8.1

在 Bash 中使用 cut 命令拆分字符串

下面的脚本使用 cut 命令来提取子字符串。-d 选项指定用于将字符串划分为字段的分隔符,而 -f 选项设置要提取的字段的编号。

但是在我们的例子中,字符串使用 - 作为分隔符进行分割,为了访问第一个字段,我们将参数 1 传递给 -f 选项,我们执行相同的操作来访问第二个字段将 2 传递给 -f 选项。

这些值分别分配给 ip_oneip_two 变量。printf 命令用于显示变量的值。

#!/usr/bin/env bash

addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"


ip_one=$(echo $addrs | cut -d '-' -f 1)
ip_two=$(echo $addrs | cut -d '-' -f 2)

printf "$ip_one\n$ip_two\n"

下面的输出显示从 $addrs 字符串变量拆分的第一个和第二个字符串。

192.168.8.1
192.168.8.2
作者: Fumbani Banda
Fumbani Banda avatar Fumbani Banda avatar

Fumbani is a tech enthusiast. He enjoys writing on Linux and Python as well as contributing to open-source projects.

LinkedIn GitHub

相关文章 - Bash String