grep/awk/sed 的正则表达式,如何只把匹配的内容(不是整个匹配行)提取出来,保存到 shell 脚本变量
2021/7/23 7:07:00
本文主要是介绍grep/awk/sed 的正则表达式,如何只把匹配的内容(不是整个匹配行)提取出来,保存到 shell 脚本变量,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
问题 1
描述
bash 脚本中,需要把参数 -J -I 1 -M1 -a1 -x1
中的 -I x
参数提取出来,保存备用。
确定正则表达式
-I
后面可以有一个空格,也可以没有,空格之后只能是 0
或 1
,正则表达式很容易写出来 -I ?[01]
仅提取匹配内容,而非整行
可以通过 grep
的 -o
参数实现
测试
echo "-J -I0 -M1 -a1 -x1" | grep -oE '\-I ?[01]' # 输出 -I0 echo "-J -I 1 -M1 -a1 -x1" | grep -oE '\-I ?[01]' # 输出 -I 1 echo "-J -I 2 -M1 -a1 -x1" | grep -oE '\-I ?[01]' # 输出为空 echo "-J -M1 -a1 -x1" | grep -oE '\-I ?[01]' # 输出为空
问题 2
描述
解决了正则匹配的问题,新的问题又来了。
脚本内的函数调用有两种方法:通过函数名 foo
直接调用,或者通过 $(foo)
调用。
注意:加不加 $()
是有差别的!具体差别如下:
#!/bin/bash GLOBAL_VAR="Initial Value" function foo() { GLOBAL_VAR=$(echo "-J -I 1 -M1 -a1 -x1" | grep -oE '\-I ?[01]') echo "Hello World" } $(foo) # 新建子 shell 进程执行函数,在子 shell 进程中改变 GLOBAL_VAR 不影响当前 shell 的变量,foo 输出(echo)的内容 Hello World 作为新的命令执行 echo $GLOBAL_VAR # 仍然输出"Initial Value" foo # 在当前 shell 进程中执行函数,改变 GLOBAL_VAR echo $GLOBAL_VAR # 输出"-I 1" var1=$(foo) # 调用函数 foo,foo 的输出(echo)保存到变量 var1 中,var1 内容为 "Hello World" var2=foo # var2 内容为 "foo" var3=${foo} # 把变量 foo 的内容(因为没有定义 foo 变量,foo 变量的内容自然为空)保存到 var3 变量 echo "var1: $var1" # 输出 Hello World echo "var2: $var2" # 输出 foo echo "var3: $var3" # 无输出
注意!即使在 $(foo)
函数中 export
了 GLOBAL_VAR
也是不行的。因为环境变量也是只能在当前 shell 和子 shell 进程中生效,无法在父 shell 进程中访问。
这篇关于grep/awk/sed 的正则表达式,如何只把匹配的内容(不是整个匹配行)提取出来,保存到 shell 脚本变量的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-11正则表达式教程:初学者指南
- 2024-09-11正则表达式学习:入门指南与实践技巧
- 2024-08-15正则表达式入门:基础教程与实践指南
- 2024-01-0939. 干货系列从零用Rust编写负载均衡及代理,正则及格式替换
- 2024-01-08如何编写高效的正则表达式?
- 2023-12-29"Matlab中的正则表达式:强大而灵活的工具"
- 2023-09-30这个正则 为啥同样的单号第二个就提取不出来?
- 2023-06-086.2 re 正则表达式
- 2023-06-06将字符串里的\x01,\x02这些替换掉用正则表达式无效?
- 2023-05-24正则表达式详解