Bash 字符串操作示例—长度、子字符串、查找和替换

举报
Tiamo_T 发表于 2022/03/18 16:00:28 2022/03/18
【摘要】 在 bash shell 中,当您使用美元符号后跟变量名时,shell 会使用其值扩展变量。shell 的这个特性称为参数扩展。 但是参数扩展有许多其他形式,允许您扩展参数并在扩展过程中修改值或替换其他值。在本文中,让我们了解一下如何使用参数扩展概念进行字符串操作。

在 bash shell 中,当您使用美元符号后跟变量名时,shell 会使用其值扩展变量。shell 的这个特性称为参数扩展。

但是参数扩展有许多其他形式,允许您扩展参数并在扩展过程中修改值或替换其他值。在本文中,让我们了解一下如何使用参数扩展概念进行字符串操作。

本文是正在进行的 bash 教程系列的一部分。请参阅我们之前关于bash { } 扩展的文章。

1. 识别 Bash Shell 脚本中的字符串长度

${#string}

上述格式用于获取给定 bash 变量的长度。

$ cat len.sh
#! /bin/bash

var="Welcome to the geekstuff"

echo ${#var}

$ ./len.sh
24

要了解有关 bash 变量的更多信息,请阅读6 个实用的 Bash 全局和局部变量示例

2. 从 Bash Shell 脚本中的变量中提取子字符串

Bash 提供了一种从字符串中提取子字符串的方法。以下示例说明如何解析从特定位置开始的 n 个字符。

${string:position}

在 $position 从 $string 中提取子字符串

${string:position:length}

从 $position 开始的 $string 中提取 $length 个字符子串。在下面的示例中,第一个 echo 语句返回从第 15 个位置开始的子字符串。第二个 echo 语句返回从第 15 个位置开始的 4 个字符。长度必须是大于或等于零的数字。

$ cat substr.sh
#! /bin/bash

var="Welcome to the geekstuff"

echo ${var:15}
echo ${var:15:4}

$ ./substr.sh
geekstuff
geek

另外,请参阅我们之前的文章以了解有关$*、$@、$#、$$、$!、$?、$-、$_ bash 特殊参数的更多信息。

3. 最短子串匹配

以下语法从 $string 前面删除 $substring 的最短匹配

${string#substring}

以下语法从 $string 后面删除 $substring 的最短匹配

${string%substring}

以下示例 shell 脚本解释了上述两个最短子字符串匹配概念。

$ cat shortest.sh
#! /bin/bash

filename="bash.string.txt"

echo ${filename#*.}
echo ${filename%.*}

$ ./shortest.sh
After deletion of shortest match from front: string.txt
After deletion of shortest match from back: bash.string

在第一个 echo 语句中,子字符串 '*.' 匹配字符和点,# 从字符串的前面去掉,所以它去掉了子字符串“bash”。来自名为文件名的变量。在第二个 echo 语句中,子字符串 '.*' 匹配以点开头的子字符串,并且 % 从字符串后面剥离,因此它删除了子字符串 '.txt'

4. 最长子串匹配

以下语法从 $string 前面删除 $substring 的最长匹配

${string##substring}

以下语法从 $string 后面删除 $substring 的最长匹配

${string%%substring}

以下示例 shell 脚本解释了上述两个最长子字符串匹配概念。

$ cat longest.sh
#! /bin/bash

filename="bash.string.txt"

echo "After deletion of longest match from front:" ${filename##*.}
echo "After deletion of longest match from back:" ${filename%%.*}

$ ./longest.sh
After deletion of longest match from front: txt
After deletion of longest match from back: bash

在上面的示例中,##*。去除 '*.' 的最长匹配。匹配“bash.string”。所以在剥离后,它会打印剩余的txt。并且 %%.* 从后面删除与“.string.txt”匹配的 .* 的最长匹配项,删除后返回“bash”。

5. 在 Bash Shell 脚本中查找和替换字符串值

仅替换第一个匹配项

${string/pattern/replacement}

它匹配变量 $string 中的模式,并且仅用替换替换模式的第一个匹配项。

$ cat firstmatch.sh
#! /bin/bash

filename="bash.string.txt"

echo "After Replacement:" ${filename/str*./operations.}

$ ./firstmatch.sh
After Replacement: bash.operations.txt

替换所有匹配项

${string//pattern/replacement}

它用替换替换所有匹配的模式。

$ cat allmatch.sh
#! /bin/bash

filename="Path of the bash is /bin/bash"

echo "After Replacement:" ${filename//bash/sh}

$ ./allmatch.sh
After Replacement: Path of the sh is /bin/sh

关于查找和替换,请参阅我们之前的文章——sed 替换示例Vim 查找和替换

替换开头和结尾

${string/#pattern/replacement}

仅当模式匹配 $string 的开头时,以下语法才会替换为替换字符串。

${string/%pattern/replacement}

仅当模式在给定 $string 的末尾匹配时,以下语法才会替换为替换字符串。

$ cat posmatch.sh
#! /bin/bash

filename="/root/admin/monitoring/process.sh"

echo "Replaced at the beginning:" ${filename/#\/root/\/tmp}
echo "Replaced at the end": ${filename/%.*/.ksh}

$ ./posmatch.sh
Replaced at the beginning: /tmp/admin/monitoring/process.sh
Replaced at the end: /root/admin/monitoring/process.ksh
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。