Bash 字符串操作示例—长度、子字符串、查找和替换
在 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
- 点赞
- 收藏
- 关注作者
评论(0)