Фильтрация смайликов с помощью 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 ответ:
Вам нужно экранировать
/
, иначе это преждевременно завершит выражение.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