尝试使用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
答案 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}'