AI智能
改变未来

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]\'   # 输出 -I0echo "-J -I 1 -M1 -a1 -x1" | grep -oE \'\\-I ?[01]\'  # 输出 -I 1echo "-J -I 2 -M1 -a1 -x1" | grep -oE \'\\-I ?[01]\'  # 输出为空echo "-J -M1 -a1 -x1" | grep -oE \'\\-I ?[01]\'       # 输出为空

问题 2

描述

解决了正则匹配的问题,新的问题又来了。脚本内的函数调用有两种方法:通过函数名

foo

直接调用,或者通过

$(foo)

调用。注意:加不加

$()

有如下差别:

#!/bin/bashGLOBAL_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 作为新的命令执行(会提示找不到 Hello 命令!)echo $GLOBAL_VAR # 输出"Initial Value"foo # 在当前 shell 中执行函数,改变 GLOBAL_VARecho $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" # 输出 var1: Hello Worldecho "var2: $var2" # 输出 var2: fooecho "var3: $var3" # 输出 var3:

注意:即使在

$(foo)

函数中

export

GLOBAL_VAR

也不可以。因为环境变量也是只能在当前 shell 和子 shell 中生效,父 shell 还是无法获取到 export 的变量。

原文链接:https://www.cnblogs.com/tengzijian/p/15042797.html

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » grep awk sed 正则表达式,只把匹配的内容(不是整个匹配行)提取出来,保存到 shell 脚本变量