egrep регулярное выражение не работает на регулярное выражение, которое работает в другой программе - PullRequest
0 голосов
/ 23 октября 2010

У меня есть это рабочее регулярное выражение (проверено на тренере регулярных выражений):

\n[\s]*[0-9]*[\s]*[0-9]*(\.)?[0-9]*(e\+)?[0-9]*

, которое должно взять первые 2 столбца этого файла

http://wwwhomes.uni -bielefeld.de/achim/highly.txt

Я прочитал справочные страницы, и там написано, что ^ будет совпадать в начале строки, поэтому я заменил \ n на ^, но egrep несоглашаясь со мной, когда я делаю это:

egrep -e ^[\s]*[0-9]*[\s]*[0-9]*(\.)?[0-9]*(e\+)?[0-9]* "wwwhomes.uni-bielefeld.de achim highly.txt"

РЕДАКТИРОВАТЬ: это как-то связано с (e\+)?

РЕДАКТИРОВАТЬ 2: хорошо, я упрощаю регулярное выражение.забудьте о попытке получить числа в научной нотации, вот что я использую:

egrep -e "^[[:space:]]*[0-9]*[[:space:]]*[0-9]*" "wwwhomes.uni-bielefeld.de achim highly.txt"

возвращает строки заголовка:

   no       number      divisors    2 3 5 71113171923293137414347535961677173
------------------------------------------------------------------------------

это не правильно ...

Окончательное редактирование:

Мне понадобилась комбинация grep и sed, чтобы получить правильные данные.grep удалил строки заголовка и отформатировал текст sed

grep  -E -o -e "^[[:space:]]+[0-9]+[[:space:]]+[0-9e\+\.]+[[:space:]]+[0-9e\+\.]+" "wwwhomes.uni-bielefeld.de achim highly.txt" >grepped.txt

sed -r "s/^\s*[0-9]+\s*([0-9.e+]+)\s*([0-9.e+]+)/\1,\2/" "grepped.txt" >seded.txt 

Ответы [ 3 ]

2 голосов
/ 23 октября 2010

ERE не поддерживает \s. Используйте [[:space:]] для \s или просто .

Кажется, ^ указывает на начало текста, который еще не соответствует . Я не знаю почему. (Такое поведение верно для grep (GNU grep) 2.5.1 только в Mac OS X?)

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


Поскольку файл в формате фиксированной длины, гораздо проще использовать cut, чем создавать регулярное выражение.

cut -c 1-20 highly.txt

Вы можете использовать grep -v, чтобы отфильтровать нежелательные результаты.

1 голос
/ 23 октября 2010

Попробуйте добавить опцию -o в grep, чтобы она печатала только часть, которая соответствует шаблону, а не линию, которая имеет шаблон:

egrep -o -e  "^[[:space:]]*[0-9]*[[:space:]]*[0-9.e+]*" file
      ^^

Рабочая ссылка

В качестве альтернативы вы можете использовать sed как:

sed -r 's/^\s*([0-9]+)\s*([0-9.e+]+).*/\1 \2/' file
0 голосов
/ 24 октября 2010

если у вас есть данные, которые выглядят правильно отформатированными, с разделителями, которые вы можете идентифицировать (например, в вашем случае, табуляции / пробелы), нет необходимости использовать регулярное выражение. Используйте awk.

awk '!/--/&&$1!="no"{print $1,$2}' file

Я считаю, что этот вкладыш - это все, что вам нужно, поскольку вы сказали, что хотите получить первые 2 столбца и пропустить заголовки. Вы также можете использовать cut, но это не так гибко, как awk.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...