在 Bash 中将字符串拆分为变量
本篇文章将讨论在 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 中拆分字符串并将其存储到变量中的不同方法。 现在,读者可以很好地使用适合自己要求的方法。
相关文章
在 Bash 脚本中执行变量中的命令
发布时间:2023/05/18 浏览次数:106 分类:操作系统
-
本篇文章是关于将 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 浏览次数:58 分类:操作系统
-
在 Bash 脚本中,您还可以使用数组; 您可以对数组进行声明、修改和操作。但在本文中,我们将逐步了解如何声明一个数组并将新数据添加到其中。 我们将看到在数组中添加新数据的两种不同
在 Bash 中打印数组元素
发布时间:2023/05/18 浏览次数:192 分类:操作系统
-
本文将展示我们如何在 Bash 脚本中打印数组元素。 为此,我们将讨论 5 种不同的方法。在 Bash 中使用 echo 语句打印数组元素
将数组传递给 Bash 中的函数
发布时间:2023/05/18 浏览次数:118 分类:操作系统
-
这篇文章是关于在 Bash 脚本中使用函数并将数组传递给它们的。 在进入实际主题之前,我们将简要介绍 Bash 脚本。