📜  Bash 脚本 – 子字符串

📅  最后修改于: 2022-05-13 01:57:26.954000             🧑  作者: Mango

Bash 脚本 – 子字符串

在本文中,我们将讨论如何编写 bash 脚本来从字符串中提取子字符串。

提取基于索引的子字符串

有多种方法可以根据字符串中字符的索引来获取子字符串:

  • 使用剪切命令
  • 使用 Bash 子字符串
  • 使用 expr substr 命令
  • 使用 awk 命令

方法一:使用cut命令

剪切命令用于执行切片操作以获得所需的结果。

句法:

cut [option] range [string/filename]

-c 选项用于按字符剪切字符串。必须指定字符数的列表或范围,否则此选项会出错。在 range 中,指定 original 的索引范围以获取子字符串。它使用基于 1 的索引(索引从 1 开始)系统。

示例 1:出于演示目的,让我们提取字符串“01010string”中字符的最后一个 0。

代码:

cut -c 6-11<<< '01010string'

<<< 被称为此处字符串。使用它,可以将预先制作的文本字符串传递给程序。我们指定了范围 6-11,因为 6 是起始索引,而 11 是我们想要的结果的结束索引。

输出:

示例 2:现在提取字符'01010string' 中 's' 之前的字符串。

代码:

cut -c 1-5<<< '01010string'

我们指定了 1-5 的范围,因为 1 是起始索引,5 是我们想要的结果的结束索引。

输出:

方法 2: Bash 的子字符串(不使用外部命令)

句法:

${VAR:start_index:length}

它使用基于 0 的索引系统。

示例 1:为了演示,我们将从索引 11 到索引 15 的字符串“我的名字是 ROMY”中提取子字符串。对于 11 到 15 的索引,子字符串的长度将变为 4。

代码:

STR="My name is ROMY"
echo ${STR:11:4}

输出:

示例 2:提取位于索引 10 之前的字符串。由于此方法使用基于 0 的索引系统,因此所需字符串的长度将为 10。

代码:

STR="My name is ROMY"
echo ${STR:0:10}

输出:

方法三:使用 expr 命令

它用于执行:

  • 加法、减法、乘法、除法和模数运算。
  • 评估正则表达式,字符串操作,如子字符串。

它使用基于 1 的索引系统。

示例 1:为了演示,我们将从索引 12 到索引 16 的字符串'My name is ROMY' 中提取子字符串。对于 12 到 16 的索引,子字符串的长度将变为 4。

句法:

expr substr   

代码:

expr substr "My name is ROMY" 12 4

输出:

示例 2:从字符串start 到索引 10 提取子字符串。由于该方法使用基于 1 的索引系统,因此到索引 10 的字符串的长度为 9。

代码:

expr substr "My name is ROMY" 1 9

输出:

方法四:使用awk命令

它是一种用于操作数据的脚本语言。它不需要编译,允许字符串函数、变量等。它有一个内置的 substr()函数,可以直接用来获取子字符串。

substr(s, i, n)函数接受三个参数。

  • s : 输入字符串
  • i : 子串的起始索引
  • n :子字符串的长度。

它使用基于 1 的索引系统。

句法:

awk '{print substr($var,start_index, length)}'

示例 1:从索引 12 开始提取长度为 5 的子字符串。

代码:

awk '{print substr($0, 12, 5)}' <<< 'My name is ROMY'

输出:

示例 2:从索引 1 开始提取长度为 10 的字符串。

代码:

awk '{print substr($0, 1, 10)}' <<< 'My name is ROMY'

输出:

提取基于模式的子字符串

有多种方法可以根据字符串的模式获取子字符串:

  • 使用剪切命令
  • 使用 awk 命令

方法一:使用cut命令

为了演示,将输入字符串设为逗号分隔值:“Romy, Pushkar, Kareena, Katrina”。 (-d ,) 选项与 cut 命令一起使用,以告诉命令输入字符串是逗号分隔值。 -f 选项告诉 cut 命令根据字段(如 (-f 3) 用于字符串。

句法:

cut [option] field_position <<< "comma_seperated_string"

代码:

cut -d, -f 3 <<< “Romy,Pushkar,Kareena,Katrina”.

这将提取第三个字段。

输出:

方法二:使用awk命令

句法:

代码:

从字符串中提取第三个字段

输出:

不同的基于模式的子串案例

输入字符串不一定是逗号分隔值。

在此方法中,我们将看到获取位于字符串中两个模式之间的子字符串的方法。这个问题可以使用 awk 命令解决。

  • sub(/.*start/, “”) - 它在开始之前删除所有内容,直到“开始”。
  • sub(/end.*/, “”) - 它从“end”中删除所有内容以及 end。

句法:

代码:

STR="Hello!! My name is ROMY kumari"
awk '{ sub(/.*!!/, ""); sub(/kumari.*/, ""); print }' <<< "$STR"

输出: