1

Я бегу:

awk -F ',' '{print $2}' data.dat | sort | uniq |  tr '\n' ',' | grep "*)>nS4XkrlH  @XUL"

и последовательность находится в результатах.

Тогда я бегу

b=`awk -F ',' '{print $2}' data.dat | sort | uniq |  tr '\n' ','`
echo $b | grep "*)>nS4XkrlH  @XUL"

но результат не возвращается.

У кого-нибудь есть идеи, почему это происходит?

Спасибо за любую помощь.

1 ответ1

0

Ключевое различие между этими двумя последовательностями команд заключается в том, что вторая содержит echo $b которая выполняет разбиение слов оболочки. Чтобы вторая последовательность команд выполнялась так же, как и первая, замените:

echo $b | grep "*)>nS4XkrlH  @XUL"

с:

echo "$b" | grep "*)>nS4XkrlH  @XUL"

Расщепление слов

Посмотрите, как обрабатываются пробелы в этих двух echo выражениях:

$ b="a   b c"
$ echo "$b"
a   b c
$ echo $b
a b c

Без двойных кавычек оболочка выполняет разбиение слов по аргументам echo . Это означает, что все последовательные пробелы сгущаются в одно пространство. В двойных кавычках расщепление слов подавляется и пробелы сохраняются.

Разделение слов и шаблон grep с несколькими пробелами

Ваш шаблон grep содержит два последовательных пробела. Если аргумент echo в двойных кавычках, выходные данные echo не будут иметь этих двух пробелов и совпадение не будет найдено. Заметим:

$ b="*)>nS4XkrlH  @XUL"
$ echo $b | grep "*)>nS4XkrlH  @XUL"
$ echo "$b" | grep "*)>nS4XkrlH  @XUL"
*)>nS4XkrlH  @XUL

Первый grep не совпадает ни с чем, кроме второго. Разница заключается в разделении слов в оболочке.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .