Фильтрация смайликов с помощью sed


У меня есть выражение grep, использующее cygwin grep на Win.

grep -a "\,,/|\m/|\m/\>.</\m/|:u" all_fbs.txt > rockon_fbs.txt
Однако, как только я идентифицирую класс смайликов, я хочу удалить их из данных. Однако то же самое регулярное выражение выше в sed приводит к синтаксической ошибке (да, я понимаю, что мог бы использовать /d вместо //g, но это не имеет значения, я все равно получаю ошибку.)
sed "s/(\,,/|\m/|\m/\>.</\m/|:u)*//g"

Полная строка:

grep -a "\,,/|\m/|\m/\>.</\m/|:u" all_fbs.txt | sed "s/(\,,/|\m/|\m/\>.</\m/|:u)*//g" | sed "s/^/ROCKONt/" > rockon_fbs.txt

Результат таков:

sed: -e expression #1, char 14: unknown option to `s'

Я знаю, что это исходит из регулярного выражения sed, я спрашиваю об этом b/c, если я удалите эту часть полной строки, тогда я не получу ошибки (но, конечно, смайлики не отфильтрованы).

Заранее спасибо,

Стив

1 2

1 ответ:

Вам нужно экранировать /, иначе это преждевременно завершит выражение.

s/\(\\,,/\|\\m/\|\\m/\\>\.</\\m/\|:u\)*//g
        ^     ^     ^      ^   ^
          These need escaping.

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

$ echo "\\,"
\,
$ echo '\\,'
\\,

Итак, попробуйте следующее:

$ echo 'foo \m/ bar \,,/ baz' | sed 's/\(\\,,\/\|\\m\/\|\\m\/\\>\.<\/\\m\/\|:u\)*//g'
foo  bar  baz