在 Bash 脚本中查找空格的结束位置

在 Bash 脚本中查找空格的结束位置

我正在编写一个 Bash 脚本,我想找到多个字符串中空格的结束位置。我不能只搜索空格,因为它可能包含制表符。以下是我可能搜索的几行示例。

11:tcp_listen         1.2.3.4:3478
12:tcp_listen              [::1]:3478
13:tcp_listen               [2600:2700:2800:2900:3000:3100:3200:3300]:3478
  • 第一行:空白结束位置:21
  • 第二行:空白结束位置:26
  • 第三行:空白结束位置:24

我循环遍历每一行,并将每一行作为变量。

例子:

line="11:tcp_listen         1.2.3.4:3478"

答案1

尝试在此网页中粘贴混合空格和制表符失败,但是:

$ line="11:tcp_listen         1.2.3.4:3478"
$ shopt -s extglob                                  # important!
$ prefix_with_spaces=${line%%+([^[:space:]])}
$ echo ">$prefix_with_spaces<"
>11:tcp_listen         <
$ echo ${#prefix_with_spaces}
22

让我们用实际的标签来尝试一下

$ line=$'11:tcp_listen\t\t1.2.3.4:3478'
$ prefix_with_spaces=${line%%+([^[:space:]])}
$ echo ${#prefix_with_spaces}
15

我正在使用 shell 参数扩展和扩展模式。查看手册页了解详细信息。

类似地,如果您想获取最后一个空格后面的文本:相同的技术,更简单的模式:

$ line="11:tcp_listen         1.2.3.4:3478"
$ suffix=${line##*[[:space:]]}
$ echo ">$suffix<"
>1.2.3.4:3478<
$ line=$'11:tcp_listen\t\t1.2.3.4:3478'
$ suffix=${line##*[[:space:]]}
$ echo ">$suffix<"
>1.2.3.4:3478<

相关内容