我有变量:
A="Some variable has value abc.123"
Run Code Online (Sandbox Code Playgroud)
我需要提取这个值,即abc.123.在bash中这可能吗?
gam*_*may 80
最简单的是
echo $A | awk '{print $NF}'
Run Code Online (Sandbox Code Playgroud)
编辑:解释这是如何工作的......
awk默认情况下,使用空格作为分隔符,将输入分成不同的字段.硬编码5代替NF输入中第5个字段的打印:
echo $A | awk '{print $5}'
Run Code Online (Sandbox Code Playgroud)
NF是一个内置awk变量,它给出当前记录中的字段总数.以下返回数字5,因为字符串中有5个字段"Some variable has value abc.123":
echo $A | awk '{print NF}'
Run Code Online (Sandbox Code Playgroud)
结合$与NF输出字符串中的最后一个字段,不管你的字符串有多少个字段包含的内容.
rua*_*akh 37
是; 这个:
A="Some variable has value abc.123"
echo "${A##* }"
Run Code Online (Sandbox Code Playgroud)
将打印此:
abc.123
(符号在Bash参考手册的 §3.5.3"Shell参数扩展"中进行了解释.)${parameter##word}
koo*_*ola 11
一些使用参数扩展的示例
A="Some variable has value abc.123"
echo "${A##* }"
abc.123
Run Code Online (Sandbox Code Playgroud)
""空间最长的匹配
echo "${A% *}"
Some variable has value
Run Code Online (Sandbox Code Playgroud)
最长的比赛.点
echo "${A%.*}"
Some variable has value abc
Run Code Online (Sandbox Code Playgroud)
""空间最短匹配
echo "${A%% *}"
some
Run Code Online (Sandbox Code Playgroud)
你怎么知道价值从哪里开始?如果它始终是第5和第6个单词,您可以使用例如:
B=$(echo $A | cut -d ' ' -f 5-)
Run Code Online (Sandbox Code Playgroud)
这使用cut命令切出部分行,使用简单空格作为单词分隔符.
该文档是有点痛苦的阅读,所以我在一个简单的方法概括它。
请注意, ' *' 需要与 ' '交换位置,具体取决于您使用#或%。(这*只是一个通配符,因此您可能需要在阅读时摘下“正则表达式帽子”。)
${A% *}- 删除最短尾随 *(去掉最后一个字)${A%% *}- 删除最长的尾随 *(去掉最后的话)${A#* }- 删除最短的前导* (去掉第一个单词)${A##* }- 删除最长的前导* (去掉第一个单词)当然,这里的“单词”可能包含任何不是文字空间的字符。
您可能通常使用此语法来修剪文件名:
${A##*/}删除所有包含的文件夹(例如/usr/bin/git-> git)${A%.*}删除最后一个扩展名(例如archive.tar.gz-> archive.tar) - 只是要警惕这样的事情my.path/noext正如 Zedfoxus在这里指出的那样。一种非常干净的方法,适用于所有基于 Unix 的系统。此外,您不需要知道子字符串的确切位置。
A="Some variable has value abc.123"
echo "$A" | rev | cut -d ' ' -f 1 | rev
# abc.123
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36885 次 |
| 最近记录: |