【问题标题】:Extracting group from regex in shell script using grep使用 grep 从 shell 脚本中的正则表达式中提取组
【发布时间】:2015-10-08 06:19:24
【问题描述】:

我想在变量中提取通过 shell 脚本运行的命令的输出,但我无法做到。我正在使用grep 命令。请帮助我在变量中获得所需的输出。

x=$(pwd)
pw=$(grep '\(.*\)/bin' $x)
echo "extracted is:"
echo $pw

pwd 命令的输出是/opt/abc/bin/,我只想要/root/abc 的一部分。提前致谢。

【问题讨论】:

    标签: regex linux shell grep


    【解决方案1】:

    使用dirname 获取路径,而不是路径的最后一段。

    【讨论】:

    • 我做了修改,最后一部分bin不是文件而是目录所以报错/opt/abc/bin: is a directory
    • 您看到的错误来自您使用不正确的grep 命令。 grep 需要一个文件而不是目录。
    【解决方案2】:

    你可以使用:

    x=$(pwd)
    pw=`dirname $x`
    echo $pw
    

    或者简单地说:

    pw=`dirname $(pwd)`
    echo $pw
    

    【讨论】:

    • 还应该修复缺少正确引用的问题; echo "$pw".
    【解决方案3】:

    您正在做的所有事情都可以在一个 echo 中完成:

    echo "${PWD%/*}"
    

    $PWD 变量代表当前目录,%/* 删除最后一个/ 和最后一个/ 之后的部分。

    对于您的情况,它将输出:/root/abc

    【讨论】:

      【解决方案4】:

      grep 的第二个(以及任何后续)参数是要搜索的文件的名称,而不是要执行匹配的字符串。

      此外,grep 打印匹配行或(使用-o)匹配字符串,而不是捕获的括号。为此,您需要一个不同的工具。

      最低限度地修复您的代码

      x=$(pwd)
      pw=$(printf '%s\n' "$x" | sed 's%\(.*\)/bin.*%\1%')
      

      (如果你只关心 Bash,而不关心其他 shell,你可以在没有显式管道的情况下使用 sed ... <<<"$x";语法也更令人满意。)

      当然,shell 内置了基本的字符串操作函数。

      pw=${x%/bin*}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        • 1970-01-01
        • 2012-01-25
        • 2013-08-11
        相关资源
        最近更新 更多