Linux grep表示包含“的变量”+&引用;

Linux grep表示包含“的变量”+&引用;,linux,bash,shell,unix,Linux,Bash,Shell,Unix,尝试使用grep拾取第二行,如果第二行有“+”字符,则无效 我试过使用fgrep&而不是-p试过使用Fx或x和-w,但都不起作用 文件prereq.txt包含以下内容: WS+1 whatever 2222 WS--1 whatever2 1111 name=“$(更多prereq.txt | gre

尝试使用grep拾取第二行,如果第二行有“+”字符,则无效

我试过使用fgrep&而不是-p试过使用Fx或x和-w,但都不起作用

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

WS+1                    whatever                                2222
WS--1                   whatever2                               1111
name=“$(更多prereq.txt | grep-P”(^ |\s)$model($|\s)”| awk'{print$2})”
它在有“+”的地方起作用,但在有“+”的地方不起作用

预期结果:

model=WS+1

Output :

echo $name
whatever

问题是,
grep
+
解释为量词,而不是字符串

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

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


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

这可能更容易使用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";
             }
           '
)"
你可以用

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

请您编辑您的问题,并明确区分代码和常规文本好吗?例如,
它是否在某处工作…
实际上是您输入文件的一部分,还是您问题的一部分。编辑过的Tim,有什么建议吗?我见过很多,但这是我第一次看到usless使用更多。为了更好的风格和效率,请编写
grep。。。file
而不是
更多文件| grep…
您忘记在示例中应用\Q和\E。顺便说一句,既然OP愿意使用grep的
-P
选项,他也可以在grep中使用这个技巧;不需要恢复到Perl。@user1934428:Re:\Q和\E:whoops,哈!修好了,谢谢!Re:
-P
:这通常是正确的,但对于
model='\E'
这样的情况不起作用。因此,使用Perl插值,而不是Bash插值,在IMHO中更为稳健。没错,尽管我怀疑调用其模型
\E
的工程师将比发布其设计的速度更快。。。。
$ model=WS+1
$ awk -v model=$model '$1==model print {$2}' prereq.txt
whatever
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";
             }
           '
)"
model="WS[+]1"
grep -P "(^|\s)$model($|\s)" prereq.txt | awk '{print $2}'