grep表示包含“ +”的变量

时间:2019-04-05 04:29:00

标签: linux bash shell unix

尝试使用grep提取第二行,如果它带有“ +”字符,则可以正常工作

我尝试使用fgrep&而不是-P尝试使用Fx或x和-w,但是它们都不起作用。

文件prereq.txt包含以下内容:

WS+1                    whatever                                2222
WS--1                   whatever2                               1111
name="$(more prereq.txt | grep -P "(^|\s)$model($|\s)" | awk '{print $2}')"
Result :

model=WS--1

Output :

echo $name

whatever2

它可以在它的阴影或-处工作,但如果它带有“ +”,则可以正常工作

Result :

model=WS+1

Output :

echo $name

预期结果:

model=WS+1

Output :

echo $name
whatever

3 个答案:

答案 0 :(得分:2)

问题在于grep+解释为量词而不是字符串。

您可以单独使用awk来简化代码。

$ model=WS--1
$ awk -v model=$model '$1==model {print $2}' prereq.txt
whatever2

$ model=WS+1
$ awk -v model=$model '$1==model print {$2}' prereq.txt
whatever

使用-v model=$model,我们将awk变量model设置为model的shell值。然后,对于第一行具有该值的每一行,将打印第二列。

答案 1 :(得分:1)

使用Perl可能会更容易,因为Perl的正则表达式支持\Q...\E表示法来禁用插值变量中的任何特殊字符:

name="$(
  export model # export $model into environment
  perl -ne ' if (m/(^|\s)\Q$ENV{model}\E($|\s)/) {
               my @fields = split /\s+/, $_;
               print "$fields[1]\n";
             }
           '
)"

答案 2 :(得分:0)

您可以使用

model="WS[+]1"
grep -P "(^|\s)$model($|\s)" prereq.txt | awk '{print $2}'