迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 操作系统 >

在 Bash 中将字符串拆分为变量

作者:迹忆客 最近更新:2023/05/16 浏览次数:

本篇文章将讨论在 Bash 中将字符串拆分为变量的不同方法。

我们将从对字符串的简要介绍开始我们的讨论。 稍后,我们将讨论使用 Bash 示例拆分字符串的各种方法。


Bash 中的字符串

字符串是字符的组合/集合。 在 Bash 中,字符串是一种类似于整数或浮点数的数据类型。

字符也可能包括数字,因为我们将字符串中的数字视为 ASCII 字符序列。

在整数或浮点数等数据类型中,数字是一个完整的实体; 没有数字的单独存在。 但是,在字符串中,字符串中的每个字符(包括空格、逗号、分号和冒号)都有其表示。

组合起来,单个字符也代表一个完整的字符串。 您可以从键盘键入的任何字符都可以是字符串的一部分。

例如:

s1="Welcome"
s2="This is a complete sentence and string as well"
s3="The string, has some special charactrs like ,$%^[]"
s4="The population of country ABC is 12345678"

在这里,第一个字符串只有字母。 下面的字符串(即 s2)也有空格; 这些空格是字符串的一部分,将像字母一样存储。

因此,在第二个字符串中,有八个空格,这将占用内存中的八个字节。

第三个字符串有特殊字符,它们也是字符串的一部分。

最后,在第四个字符串中,我们有一个数字,不是数字而是数字的组合。 如果要以数字的形式进行计算/比较,除非通过某种机制转换为数字,否则是不可能的。


Bash 中的字符串函数

就像对整数或浮点数的算术运算一样,某些操作/函数对于字符串是可能的/可用的。

例如,我们可以比较两个字符串是否相等(如果我们必须找到一个字符串或子字符串,则需要进行相等操作)。 这是 Bash 脚本:

s1="World Cup."
s2="World Cup"

if [ "$s1" = "$s2" ]; then
    echo "Strings are equal."
else
    echo "Strings are not equal."
fi

s3="World Cup."

if [ "$s1" = "$s3" ];  then
    echo "Both the strings are equal."
else
    echo "Strings are not equal."
fi

在这里,我们有两个看起来相同的字符串; 但是,第一个字符串末尾的点有所不同。

上面的脚本首先使用 if 语句比较两个字符串,其中字符串变量用双引号括起来,并使用单个等号进行比较。

接下来,它声明另一个字符串 s3,与第一个字符串相同,并再次执行比较。 这个脚本的输出是:

Strings are not equal.
Both the strings are equal.

我们可以使用井号找到字符串的长度。 Bash脚本是:

s=abcAXYZ123456_AaBbCc
echo "Length of " $s " is:" ${#s}

这个脚本的输出是:

Length of abcAXYZ123456_AaBbCc is: 20

我们可以使用正则表达式来比较并获取子字符串的长度(我们不深入讨论正则表达式的细节,您可以在这里阅读有关正则表达式的内容)。

下面是使用正则表达式进行匹配的代码:

s=abcAXYZ123456_AaBbCc
echo `expr match "$s" 'abc[A-Z]*.2'`
echo `expr "$s" : 'abc[A-Z]*.[0-9]*_'`

在第一场匹配中,我们匹配小 abc,然后是大写字母(零个或多个),然后是数字 2。

第二场匹配使用的方式略有不同。 尽管如此,使用正则表达式匹配带有下划线的子字符串。

上述脚本的输出是:

9
14

在第一场匹配中,数字 2 出现在第 9 位,而在第二场匹配中,下划线出现在第 14 位。字符串上有一长串可能的操作/函数。

在第一场匹配中,数字二出现在第 9 位。在第二场匹配中,下划线出现在第 14 位。

然而,我们正朝着我们的主题前进,拆分一个字符串。


在 Bash 中将字符串拆分为变量

将字符串拆分为字符或子字符串是一种常见且经常使用的操作。 例如,需要将表达式拆分为变量和运算符(称为标记)才能对其求值。

在开始翻译阶段之前,编译器或其他语言翻译器使用词法分析器来分析程序、字符串,并将其拆分为变量、关键字、块、函数等。在自然语言处理中,将文章拆分为句子、单词、 动词,名词等,是必需的。

Bash 中有多种拆分字符串的方法。 我们将通过示例来讨论它们。


在 Bash 中使用 cut 命令将字符串拆分为变量

在 Bash 中,我们可以使用 cut 操作来分割字符串。 剪切命令的语法是:

cut -f(number) -d(delimiter)

cut 命令根据 -d 选项后提供的定界符拆分字符串。 字符串中的定界符可以是分隔(或假设分隔)两个子字符串的任何字符。

例如,在英语中,句子之间用点隔开; 因此,可以将点视为分隔句子的分隔符。 同样,空格是分隔单词的分隔符。

运算符是算术表达式(在编程中)中操作数之间的分隔符。

接下来,我们有一个脚本,其中我们有一个带有连字符作为分隔符的字符串。 该字符串被分成三个变量。

当我们第一次使用变量时,不需要美元符号; 但是,后续操作需要带变量的美元符号。 脚本是:

v="0123-456-789"
v1=$(echo $v | cut -f1 -d-)
v2=$(echo $v | cut -f2 -d-)
v3=$(echo $v | cut -f3 -d-)
echo $v1
echo $v2
echo $v3

这个脚本的输出是:

0123
456
789

我们将使用另一个带有剪切操作的定界符来给你一个想法。 这是另一个以冒号作为分隔符的脚本:

v="0123:456:789"
v1=$(echo $v | cut -f1 -d:)
v2=$(echo $v | cut -f2 -d:)
v3=$(echo $v | cut -f3 -d:)
echo $v1
echo $v2
echo $v3

除了定界符之外,代码是相同的。 冒号是字符串中的分隔符; 切割操作中也使用相同的方法。

这个脚本的输出是:

0123
456
789

cut 操作可以选择单个定界符; 但是,使用内部字段分隔符,我们可以使用多个分隔符。


在 Bash 中使用内部字段分隔符 (IFS) 将字符串拆分为变量

使用 IFS,我们可以使用单个或多个定界符。 在单个定界符的情况下,不需要引号; 但是,要使用各种定界符,双引号可以包含多个定界符。

让我们看一个非常基本的例子:

IFS=- read v1 v2 v3 v4 <<< this-is-batch-file
echo $v1
echo $v2
echo $v3
echo $v4

在上面的脚本中,IFS 只有一个定界符。 使用 IFS,阅读将字符串 this-is-batch-file 分配给变量 v1 到 v4。

这个脚本的输出是:

this
is
batch
file

接下来,我们有一个多分隔符的例子。 请参阅以下脚本:

IFS=" ,: " read v1 v2 v3 v4 <<< is,something,strange:there
echo $v1
echo $v2
echo $v3
echo $v4

这里,IFS中使用了两个定界符,string也包含两个定界符。 前三个单词用逗号分隔,最后一个单词用冒号分隔。

输出是:

is
something
strange
there

现在使用 IFS,我们可以选择多个定界符。

我们总是需要给定界符来分割字符串吗? 答案是不; 我们还有其他方法。


在 Bash 中使用 read 和 sed 将字符串拆分为变量

我们可以使用 read 和 sed(一种可以逐行执行许多字符串操作的特殊命令)将字符串拆分为字符数组。 所以,一旦我们有了一个字符数组,我们就可以根据我们的特定要求来操作它们。

这是脚本:

read -ra var5 <<<"$(echo "12-34-56" | sed 's/./& /g')"
echo ${var5[0]}
echo ${var5[1]}
echo ${var5[2]}
echo ${var5[3]}

这个脚本的输出是:

1
2
-
3

请注意 ,即使连字符也被作为字符放置; 因此,此方法不能在任何分隔符上拆分字符串。 相反,它将字符串分解为一个字符数组。

这种方法有一个例外。 如果在字符之间使用空格,进程将忽略空格,结果数组中没有空格。

让我们使用以下脚本和相邻的输出来理解这一点:

read -ra var51 <<<"$(echo "FG HI JK" | sed 's/./& /g')"
echo ${var51[0]}
echo ${var51[1]}
echo ${var51[2]}
echo ${var51[3]}

输出是:

F
G
H
I

在输出中,下标/索引 2 显然包含字母 H 而不是空格字符。


在 Bash 中使用带匹配的正则表达式将字符串拆分为变量

我们已经共享了一个链接以阅读有关正则表达式的信息。 在这里,我们有另一种拆分字符串的方法,使用正则表达式和使用 =~ 的匹配操作。

脚本是:

re="^([^-]+)-(.*)$"
[[ "31-28-31" =~ $re ]] && var6="${BASH_REMATCH[1]}" && var_r="${BASH_REMATCH[2]}"
[[ $var_r =~ $re ]] && var7="${BASH_REMATCH[1]}" && var8="${BASH_REMATCH[2]}"
echo "First:" $var6
echo "Second:" $var7
echo "Third:" $var8

连字符再次用作分隔符,我们的正则表达式包含一个连字符。 输出是:

First: 31
Second: 28
Third: 31

接下来,我们使用相同的方法,但使用不同的分隔符逗号。 脚本是:

re1="^([^,]+),(.*)$"
[[ "high,risk" =~ $re1 ]] && v1="${BASH_REMATCH[1]}" && v2="${BASH_REMATCH[2]}"
echo "First:" $v1
echo "Second:" $v2

输出是:

First: high
Second: risk

最后,我们介绍了在 Bash 中拆分字符串并将其存储到变量中的不同方法。 现在,读者可以很好地使用适合自己要求的方法。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 Bash 脚本中执行变量中的命令

发布时间:2023/05/18 浏览次数:106 分类:操作系统

本篇文章是关于将 Bash 命令存储在一个变量中,然后直接从这个变量中执行它。 首先,我们将讨论执行变量中包含的命令的多种方法,然后是几个脚本示例。

Bash 变量相乘

发布时间:2023/05/18 浏览次数:50 分类:操作系统

本篇文章介绍如何在 Bash 中将两个变量相乘。在 Bash 中乘以变量。将两个变量相乘在 Bash 中是一个简单的操作。

Bash md5sum 命令

发布时间:2023/05/18 浏览次数:197 分类:操作系统

本篇文章介绍如何在 Bash 中使用 md5sum 命令。Bash md5sum 命令。md5sum 命令打印给定文件的 32 字符和 128 位校验和。

在 Bash 中排序数组

发布时间:2023/05/18 浏览次数:150 分类:操作系统

对数组进行排序对于任何编程语言来说都是一项非常常见的任务。 在 Bash 脚本中,我们还可以通过两种不同的方式完成此任务。

Bash 中的多维数组

发布时间:2023/05/18 浏览次数:70 分类:操作系统

多维数组对于任何程序都是非常重要的元素。 它主要用于创建数据的表视图和许多其他用途。本文演示如何创建二维数组。 此外,我们将通过必要的示例和解释来讨论该主题。

在 Bash 中打印数组元素

发布时间:2023/05/18 浏览次数:192 分类:操作系统

本文将展示我们如何在 Bash 脚本中打印数组元素。 为此,我们将讨论 5 种不同的方法。在 Bash 中使用 echo 语句打印数组元素

将数组传递给 Bash 中的函数

发布时间:2023/05/18 浏览次数:118 分类:操作系统

这篇文章是关于在 Bash 脚本中使用函数并将数组传递给它们的。 在进入实际主题之前,我们将简要介绍 Bash 脚本。

Bash 关联数组

发布时间:2023/05/18 浏览次数:71 分类:操作系统

本篇文章介绍如何在 Bash 中创建关联数组。Bash 关联数组 数组在 Bash 中可以很好地用于存储数据,

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便