sed (bash) интерпретирует регулярные выражения иначе, чем любой другой инструмент? - PullRequest
0 голосов
/ 09 июня 2019

Я использую sed для очистки текстового файла размером 100 МБ, содержащего частоты слов.

Чтобы проверить свою работу, я работаю с этим коротким примером:

86501.522305    .
30876.406478    yes
15806.203945    no
15397.078939    what
9461.059877     8
10526.408684    ,

Пробел - это символ табуляции.Моя цель состоит в том, чтобы очистить все строки словами «non-words», то есть в строках 1, 5 и 6.

Мое регулярное выражение

^\S*?\t[\W\d]+$ 

отлично работает при тестировании на Regex101 и в Notepad ++, но моя команда sed

sed -ri 's/^\S*?\t[\W\d]+$//g' sample.txt

сохраняет файл полностью неизменным (за исключением метаданных файла).

У кого-нибудь есть идеи, что может вызвать это странное поведение?

Я проверил документы для расширенных регулярных выражений и попытался экранировать все виды символов, но безуспешно.

1 Ответ

2 голосов
/ 09 июня 2019

В поведении seds нет ничего странного, вы просто неправильно поняли, что существует множество различных разновидностей регулярных выражений и несколько инструментов, которые поддерживают некоторые / все из них по-разному с различными опциями и разными предостережениями.

sed по умолчанию поддерживает PREIX BRE, в то время как ваше регулярное выражение содержит PCRE (не ERE) с кучей расширений, не относящихся к POSIX. GNU и OSX / BSD sed поддерживают ERE с аргументом -E (более старые GNU seds используют -r), а GNU sed поддерживает некоторые расширения - я ожидаю, что \ S и, возможно, \ W будут работать, но не \ d. Нет sed поддерживает PCRE.

FWIW Я бы использовал awk для этого для ясности, эффективности, переносимости и т. Д.:

$ awk '{print ($NF ~ /[[:alnum:]_]/ ? $0 : "")}' file | cat -n
     1
     2  30876.406478    yes
     3  15806.203945    no
     4  15397.078939    what
     5  9461.059877     8
     6

Это будет работать с любым awk в любой оболочке на каждом компьютере UNIX. | cat -n только для того, чтобы показать, что строки были удалены, а не удалены.

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