Экранирование звездочек и других специальных символов в сценарии оболочки - PullRequest
0 голосов
/ 25 марта 2012

У меня есть требование читать файл, построчно и создавать пипетированный оператор grep, чтобы исключить эти шаблоны, используя флаг -v, т. Е. У меня есть файл, скажем, негативный список , который содержитследующие шаблоны:

Hello
World
Java

Таким образом, я построчно читаю этот файл и строю пипетированный оператор grep следующим образом, чтобы исключить эти шаблоны из файла примера: inputfile

grep -v "Hello" входной файл |grep -v "Мир" |grep -v "Java"

Однако я сталкиваюсь с проблемами при объявлении специальных символов в негативном списке .Хотя я обычно использую grep -v '*' inputfile , чтобы удалить все строки, содержащие звездочку, я не могу заставить это работать.Избавление от звездочек с одинарными кавычками в негативе , похоже, не помогает.Любые мысли о том, как я должен избежать звездочки, чтобы я мог удалить строки, содержащие ее, используя мой текущий подход, заключающийся в том, чтобы окружить любую строку, прочитанную из негатива двойными кавычками?

Чтобы уточнить, У меня есть следующий набор ограничений:

  • Строка конвейера grep создается сценарием в следующем виде: grep -v "line1 из neglist " inputfile |grep -v "line2 из отрицательный список ... и т. д.
  • Далее этот скрипт запускает эту команду grep и сохраняет ее вывод в другом файле.
  • Я могу толькоуправляйте тем, что идет между двойными кавычками, определяя шаблоны в негативном списке . Я не могу изменить способ, которым скрипт генерирует эти операторы grep по каналам
  • Даже думал, что получаю желаемый результат, выполняяgrep "*" inputfile из командной строки, простое сохранение * в отрицательный список не дает желаемого результата удаления всех строк, содержащих в себе звездочку.
  • Далее, определяя шаблон, такой как Hello. * World, чтобы исключить все строки вида

    Hellotest1World или

    Hellotest2World

когдаопределенный в отрицательный список , похоже, тоже не работает, возможно, возможно, звездочка не экранирована правильно. Следующий оператор в командной строке работает правильно: grep -v "Hello. * World " inputfile , то есть он корректно удаляет все строки, содержащие Hello, за которыми следуют любые символы, за которыми следует World

1 Ответ

2 голосов
/ 25 марта 2012

Вы должны использовать fgrep вместо grep, который выполняет точное совпадение, не расширяя ничего.

Ex:

$ cat /tmp/a
aaa
zzz
eee
***
rrr
ttt
yyy

$ fgrep -v -e 'aaa' -e '*' -e zzz -e yyy /tmp/a
eee
rrr
ttt
...