grep/awk/sed 的正则表达式,如何只把匹配的内容(不是整个匹配行)提取出来,保存到 shell 脚本变量

问题 1

描述

bash 脚本中,需要把参数 -J -I 1 -M1 -a1 -x1 中的 -I x 参数提取出来,保存备用。

确定正则表达式

-I 后面可以有一个空格,也可以没有,空格之后只能是 01,正则表达式很容易写出来 -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) 函数中 exportGLOBAL_VAR 也是不行的。因为环境变量也是只能在当前 shell 和子 shell 进程中生效,无法在父 shell 进程中访问。

上一篇:Linux11


下一篇:linux系统中sed命令删除指定行后的下一行