2012-03-25 2 views
0

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

Hello 
World 
Java 

Таким образом, я прочитал этот файл построчно и построить водопроводное заявление Grep следующим образом, чтобы устранить эти модели из файла образца, входной_файла

Grep -v "Привет" inputfile | grep -v "Мир" | grep -v "Java"

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

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

  • Grep конвейер строка строятся с помощью скрипта в следующем виде: Grep -v «line1 из negativelist» входной_файла | Grep -v «line2 из negativelist ... и так далее
  • Кроме того, этот скрипт запускает эту команду Grep и сохраняет свой вывод в другой файл.
  • Я могу контролировать только то, что происходит между двойными кавычками, по определение закономерностей в negativelist. Я не могу изменить способ скрипта генерирует этот Piped заявление Grep
  • Даже думал, что я получить желаемый результат, выполнив Grep «*» входной_файла из командной строки, просто хранить * в negativelist не дает желаемого результата удаления всех строк, содержащих стериск в них.
  • Кроме того, определение шаблона, такие как Hello. * World устранить все строки вида

    Hellotest1World или

    Hellotest2World

, когда это определено в negativelist Безразлично» t, похоже, работает либо, возможно, звездочка не сбрасывается правильно. Следующее утверждение в командной строке работает правильно: Grep -v «Hello World» * входной_файл , т.е. правильно устраняет все строки, содержащие Hello следует любой символ (ы) между ними следуют World

ответ

2

Вы должны используйте 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 
+0

Спасибо за это предложение. Предполагая, что я не могу использовать fgrep, поскольку скрипт, который строит эти конвейерные заявления, не является чем-то, что я контролирую, есть ли у вас какие-либо другие предложения? – Rishabh

+0

Сообщение отредактировано. Что вы контролируете? 'grep' тоже можно использовать так:' grep '\ *' ' –

+0

Скрипт, который генерирует сжатый grep-оператор, фактически окружает каждую строку из * negativelist * двойными кавычками. Мысли о том, как я должен объявить звездочку в * negativelist * с учетом этого ограничения? – Rishabh

Смежные вопросы