【问题标题】:Echo multiline var to Grep将多行 var 回显到 Grep
【发布时间】:2018-05-24 11:32:37
【问题描述】:

如何通过管道将多行变量传递给 grep 并保留换行符?

预期结果:

$ git status --porcelain --branch
## test-branch
M  image.go
 M item.go
?? addme.go
?? testdata/
$ git status --porcelain --branch | grep -c '^??'
2

“2”就是答案。

但是在脚本中(或者只是输入命令),我无法从下面解析这个$x

$ x="$(git status --porcelain --branch)"
$ y="$(echo $x | grep -c '^??')"
$ echo "$y"
0

我怀疑这与我在 y 变量赋值中回显 $(echo $x ... 的方式有关。

编辑:我只执行一次x="$(git status --porcelain --branch)",并使用多个grep 命令解析它几十次,用于各种输出、值、计数、状态、分支、落后、领先和其他值。因此我需要将git status ...的输出赋值给一个变量,并多次解析。

【问题讨论】:

    标签: bash variables grep


    【解决方案1】:

    如果不引用$x,它将进行分词,echo 将打印一长行。你只需要使用"$x":

    x=$(git status --porcelain --branch)
    y=$(echo "$x" | grep -c '^??')
    echo "$y"
    

    另外,您不必使用额外的echo

    y=$(grep -c '^??' <<< "$x")
    

    我建议使用shellcheck。在这种情况下真的很有帮助。

    【讨论】:

    • 我将编辑我的问题。我只想在一个变量中运行一次git status ...,然后一遍又一遍地解析它几十次以获得各种输出、值、计数、状态、分支、落后、领先等......
    • @eduncan911 哦,好的。我已经相应地更新了我的答案。
    • 啊,是的。做到了!哈,我不必引用整件事。
    • @eduncan911 没错。分配给变量时,不会发生分词。
    • @eduncan911 $(grep '^##' &lt;&lt;&lt; "$x" | grep -o '\[.\+\]$')
    猜你喜欢
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多