2015-06-18 1 views
1

Я использую Gitbash в Windows. Я хочу grep для набора строк, каждый из которых заканчивается символом |Grep для нескольких строк с экранированной трубой в каждом

Я думаю, что я могу сделать, каждый из которых по отдельности с помощью обратной косой черты, чтобы избежать трубы:

grep abcdef\| filename.tsv 

Но чтобы сделать их все вместе, я в конечном итоге с:

grep 'abcdef\|\|uvwxyz\|' filename.tsv 

которая выйдет из строя. Есть идеи?

Я мог бы просто сделать каждую строку индивидуально, а затем объединить полученные файлы, но это займет несколько дней.

+1

Остерегайтесь нескольких уровней цитирования. Когда вы печатаете 'grep abcdef \ | filename.tsv', обратная косая черта не позволяет интерпретатору интерпретировать трубу и пытается вывести вывод grep abcdef в команду 'filename.tsv'. Но то, что 'grep' фактически получает в качестве своего первого аргумента, - это просто' abcdef | 'без обратной косой черты - это то, что вы хотите с основными регулярными выражениями' grep'; трубы с незаполненной спинкой берутся буквально. Когда вы помещаете аргумент в одинарные кавычки, теперь обратная косая черта переходит в 'grep', что полностью изменяет то, о чем вы просите. –

ответ

2

В основных регулярных выражениях posix, которые используются grep, вы не должны упускать из строя литерал |. Однако вам нужно избежать |, если он используется как элемент синтаксиса регулярного выражения для указания альтернатив.

Следующее выражение должно работать:

grep 'abcdef|\|uvwxyz|' filename.tsv 
+0

Спасибо, это работает. –

+0

Добро пожаловать! – hek2mgl

4

ERE может быть путь, для более легкого чтения.

egrep '(abcdef|uvwxyz)[|]' filename.tsv 

Это позволяет управлять списком строк немного более легко, и «ускользает» задний вертикальный бар, поместив его внутри диапазона. (Это также работает для точек, звездочек и т. Д.)

Если в вашей системе нет egrep, вы можете проверить, содержит ли ваш существующий grep параметр -E для расширенных регулярных выражений.

+0

Выглядит лучше, чем предлагаемое мной регулярное выражение posix! Вы правы, egrep следует использовать здесь. – hek2mgl

+0

'egrep' устарел (используйте' grep -E'). Если ваша мотивация использовать 'egrep' для сохранения символа, я бы предложил использовать' \ | 'вместо' [|] ':) –

+1

@TomFenech, я периодически вижу, что люди упоминают, что egrep устарел, но я никогда не упоминал об этом в любой документации по системам, которые я использую. Что касается или бара, я часто использую диапазоны для выхода из специальных символов, потому что они работают одинаково в BRE и ERE. – ghoti

2

Здесь два конкурирующих эффекта, которые вы можете ввести в заблуждение. Во-первых, | должен быть экранирован или процитирован так, чтобы оболочка не интерпретировалась. Во-вторых, в зависимости от того, какой режим регулярного выражения вы используете, escape/unescaping pipe меняет ли он буквенный символ или метасимвол.

Я хотел бы предложить вам изменить ваш шаблон к этому:

grep 'abcdef|\|uvwxyz|' file 

В базовом режиме регулярных выражений, сбежавшие трубы \| регулярное выражение OR, так что это соответствует либо шаблону с последующим буквальной трубой.

С другой стороны, если все модели заканчиваются в трубе и у вас есть больше, чем просто два, может быть, вы могли бы использовать это:

grep -E '(abc|def|ghi)\|' file 

В расширенном режиме, спасаясь труба имеет противоположный эффект, так что этот шаблон соответствует любой из последовательностей букв, за которыми следует буквальная труба.

+1

OP скорее всего имеет команду 'egrep', которая по умолчанию использует режим' -E' (они были традиционно отдельными командами, но в наши дни они чаще совпадают с разными значениями по умолчанию). –

+0

@MarkReed Действительно, 'egrep' GNU - это просто [сценарий оболочки] (http://git.savannah.gnu.org/cgit/grep.git/tree/src/egrep.sh), который вызывает' grep -E' , Однако это означает, что 'grep -E' - немного - быстрее, чем' egrep', так как не требуется создавать дополнительную оболочку. Вот почему я бы предпочел «grep -E» - по крайней мере, в сценариях оболочки. – hek2mgl

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