我正在编写一个 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<