grep для переменной, содержащей "+" - PullRequest
1 голос
/ 05 апреля 2019

Попытка забрать вторую строку с помощью 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 ]

2 голосов
/ 05 апреля 2019

Проблема в том, что 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. Затем для каждой строки, где первый столбец имеет это значение, печатается второй столбец.

1 голос
/ 05 апреля 2019

Это может быть проще с 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";
             }
           '
)"
0 голосов
/ 05 апреля 2019

Вы можете использовать

model="WS[+]1"
grep -P "(^|\s)$model($|\s)" prereq.txt | awk '{print $2}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...