2013-09-20 3 views
1

Я новичок в использовании регулярных выражений, надеюсь, кто-то может мне помочь. Я использую регулярное выражение ниже Grep файл CSV для строки, которая точно имеет один символ трубы (т.е. |)Regex найти строку, которая точно имеет один символ трубы

grep "^([^\\|]+\\|){1}[^\\|]+$" myfile.csv 

К сожалению, вышеприведенные дает никакого результата при использовании с Grep. Есть идеи?

Образец содержимого файла csv приведен ниже, где я ожидаю найти вторую строку.

"foo"|"foo"|"foo" 

"bar"|"bar" 

решения на этот вопрос:

grep -E "^([^|]+\|){1}[^|]+$" myfile.csv 

и

egrep "^[^|]+\|[^|]+$" myfile.csv 
+1

Это именно то, что регулярные выражения действительно не должны использоваться: они не подходят для подсчета. У вашего языка/рамки выбора очень может быть метод или функция 'str.count()'; он, безусловно, имеет 'str.find()', что было бы гораздо более уместным. –

+1

@JoshCaswell Я согласен с тем, что это может быть проще, если вы используете язык, который имеет что-то вроде этого, но он также отлично подходит для регулярных выражений (и, конечно, есть приложения для регулярного выражения, где нет доступных языков хоста, как вы предлагаете). Как показывает OP, она использует 'grep'. – Phrogz

+0

Вы можете указать флаг '-E' в' grep', чтобы получить полную расширенную поддержку регулярных выражений. – Phrogz

ответ

0

Вот решение моего вопроса. Благодаря комментариям, которые привели меня к решению этого.

grep -E "^([^|]+\|){1}[^|]+$" myfile.csv 

и

egrep "^[^|]+\|[^|]+$" myfile.csv 
4

Вы можете попробовать:

^[^|]*\|[^|]*$ 

Вам не нужно бежать | в классе символов. Также вы предположительно хотите * вместо + здесь, чтобы разрешить строки, такие как |abc, xyz| и только | самостоятельно.

+0

Спасибо за информацию об экранировании '|'. Я также использовал этот шаблон слишком раньше, но он возвращает все строки (оба с 1 и 2 '|'). –

1

Попробуйте следующее:

^[^|]+\|[^|]+$

+0

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

+0

@RebeccaAbriam работал для меня! попробуйте использовать 'egrep' вместо +1 – alfasin

+0

@alfasin да, это круто. это сработало. благодаря! –

1

Решение с использованием awk

awk 'gsub(/\|/,"|")==1' file 

gsub(/\|/,"|") это рассчитывает число | заменить, если это равное 1, то сделать действие по умолчанию, print $0

Изменить: Еще один WK:

awk 'split($0,a,"|")==2' file 

Граф, как текст много частей нырнули на |, если 2 печати.

0

Grep и регулярные выражения являются неправильным инструментом для выполнения этой задачи. Используйте что-то, что предназначено для подсчета:

+0

Спасибо! Это сработало. Я не знаком с awk, поэтому я не использовал его. –

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