如何在 Linux 上的 Bash 中操作字符串

已发表: 2022-07-28
笔记本电脑屏幕上的 Linux 命令行。
fatmawati achmad zaenuri/Shutterstock.com

如果说 Linux 具备一件事,那就是操作字符串的实用程序。 但是 Bash shell 中也内置了一整套功能。 这是它的使用方法。

字符串操作

Linux 生态系统包含用于处理文本和字符串的出色工具。 这些包括 awk、grep、sed 和 cut。 对于任何重量级的文本争论,这些应该是您的首选。

但有时,使用 shell 的内置功能很方便,尤其是在您编写简短的脚本时。 如果您的脚本要与其他人共享并且要在他们的计算机上运行,​​那么使用标准的 Bash 功能意味着您不必怀疑任何其他实用程序的存在或版本。

如果您需要专用实用程序的强大功能,请务必使用它们。 这就是他们的目的。 但通常你的脚本和 Bash 可以自己完成工作。

因为它们是 Bash 内置程序,所以您可以在脚本或命令行中使用它们。 在终端窗口中使用它们是创建命令原型和完善语法的一种快速便捷的方法。 它避免了编辑、保存、运行和调试周期。

创建和使用字符串变量

我们需要声明一个变量并为其分配一个字符串,只需为变量命名、使用等号=并提供字符串。 如果字符串中有空格,请将其用单引号或双引号括起来。 确保等号两边没有空格。

 my_string="你好,极客世界指南。"
 回声 $my_string 

创建和写入字符串变量

创建变量后,该变量名将添加到 shell 的制表符完成词列表中。 在此示例中,键入“my_”并按“Tab”键在命令行中输入了全名。

只读变量

有一个declare命令,我们可以使用它来声明变量。 在简单的情况下,您并不需要它,但使用它可以让您使用一些命令的选项。 您最常使用的可能是-r (只读)选项。 这会创建一个无法更改的只读变量。

 declare -r read_only_var="这是一个不可变字符串!"

如果我们尝试为它分配一个新值,它会失败。

 read_only_var="一个新字符串..." 

无法更改只读字符串变量

写入终端窗口

我们可以使用 echo 或 printf 将多个字符串写入终端窗口,使它们看起来好像是一个字符串。 而且我们不限于我们自己的字符串变量,我们可以将环境变量合并到我们的命令中。

 user_account="您的用户帐号是:"
 回显 $user_account $USER 

将两个字符串写入终端窗口,就好像它们是一个字符串一样

连接字符串

加号运算符+=可让您将两个字符串“相加”。 这叫做串联。

 user_account="您的用户帐号是:"
 user_account+=$USER
 回显 $user_account 

用 += 连接字符串

请注意,您不会在连接的字符串之间自动添加空格。 如果需要空格,则需要在第一个字符串的末尾或第二个字符串的开头显式放置一个。

 user_account="您的用户帐号是:"
 user_account+=$USER
 回显 $user_account 

在使用 += 连接两个字符串之前添加一个额外的空格

相关:如何在 Linux 上的 Bash 中设置环境变量

读取用户输入

除了创建将其内容定义为声明的一部分的字符串变量外,我们还可以将用户输入读入字符串变量。

read命令读取用户输入。 -p (提示)选项将提示写入终端窗口。 用户的输入存储在字符串变量中。 在此示例中,该变量称为user_file

 read -p "打开哪个文件?" user_file
 回显 $user_file 

读取用户字符串输入

如果您不提供字符串变量来捕获输入,它仍然可以工作。 用户输入将存储在一个名为REPLY的变量中。

 read -p "打开哪个文件?"
 回声 $REPLY 

在不提供字符串变量的情况下读取用户输入

提供您自己的变量并给它一个有意义的名称通常更方便。

操作字符串

现在我们有了字符串,无论是在创建时定义的、从用户输入中读取的还是通过连接字符串创建的,我们都可以开始使用它们了。

查找字符串长度

如果知道字符串的长度很重要或有用,我们可以通过在变量名前加上哈希“ # ”符号来获得它。

 my_string="这个字符串有 39 个字符。"
 回声 ${#my_string} 

获取字符串的长度

按字符偏移量提取子串

我们可以通过在字符串中提供起点和可选长度来从字符串变量中提取子字符串。 如果我们不提供长度,则子字符串将包含从起点到最后一个字符的所有内容。

起点和长度跟在变量名后面,中间有一个冒号“ : ”。 请注意,字符串变量中的字符从零开始编号。

 long_string="科学怪人或现代普罗米修斯"
 子串=${long_string:0:12}
 回显 $substring
 回声 ${long_string:27} 

从字符串的开头和结尾提取子字符串

另一种变体允许您从字符串的尾部丢弃一些字母。 实际上,它可以让您设置起点,并使用负数作为长度。 子字符串将包含从起点到字符串结尾的字符,减去您在负数中指定的字符数。

 my_string="字母"
 回声 ${my_string:5:-4} 

从字符串中间提取子字符串

在所有情况下,原始字符串变量都不会受到影响。 “提取的”子字符串实际上并未从变量的内容中删除。

按分隔符提取子字符串

使用字符偏移的缺点是您需要提前知道要提取的子字符串在字符串中的位置。

如果您的字符串由重复字符分隔,您可以提取子字符串而不知道它们在字符串中的位置,也不知道它们有多长。

要从字符串的前面进行搜索,请在变量名后面加上双百分号%% 、分隔符和星号* 。 此字符串中的单词由空格分隔。

 long_string="第一第二第三第四第五"
 回声 ${long_string%%' '*} 

通过分隔符从字符串的前面提取子字符串

这将返回不包含分隔符的字符串前面的第一个子字符串。 这称为短子字符串选项。

long substring 选项返回字符串的前面部分,直到最后一个分隔子字符串。 换句话说,它省略了最后一个分隔的子字符串。 在语法上,唯一的区别是它在命令中使用了一个百分号“ % ”。

 long_string="第一第二第三第四第五"
 回声 ${long_string%' '*} 

通过分隔符从字符串的前面提取长子字符串

正如您所期望的,您可以从字符串末尾以相同的方式进行搜索。 使用井号“ # ”代替百分号,并将分隔符移动到命令中的星号“ *之后

 long_string="this.long.string.of.words.is.delimited.by.periods"
 回声 ${long_string##*.} 

通过分隔符从字符串末尾提取子字符串

这是短子字符串选项,它会修剪从字符串后面找到的第一个不包含分隔符的子字符串。

 long_string="this.long.string.of.words.is.delimited.by.periods"
 回声 ${long_string#*.} 

通过分隔符从字符串末尾提取长子字符串

long substring 选项返回字符串的后面部分,直到字符串前面的第一个分隔符。 换句话说,它省略了第一个分隔的子字符串。

子串替换

将子串换成其他子串很容易。 格式是字符串的名称、要替换的子字符串、要插入的子字符串,用正斜杠“ / ”字符分隔。

 string="蓝猪咯咯笑"
 回声 ${字符串/猪/山羊} 

替换字符串中的子字符串

要将搜索限制在字符串的末尾,请在搜索字符串前加上百分号“ % ”字符。

 string="蓝猪咯咯笑"
 echo ${string/%giggles/chuckles} 

在字符串末尾替换子字符串

要将搜索限制在字符串的开头,请在搜索字符串之前加上一个井号“ # ”字符。

 string="蓝猪咯咯笑"
 回声 ${string/#blue/yellow} 

在字符串的开头替换子字符串

字符串是一个灵活的东西

如果字符串不是您想要的或需要的,这些工具将帮助您重新格式化它,使其适合您的需要。 对于复杂的转换,请使用专用实用程序,但对于较小的调整,请使用内置的 shell 并避免加载和运行外部工具的开销。

相关:你想知道的关于 Linux 上的 inode 的一切