Фильтрация смайликов с помощью sed - PullRequest
2 голосов
/ 24 мая 2010

У меня есть выражение 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/^/ROCKON\t/" > rockon_fbs.txt

Результат:

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

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

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

Стив

1 Ответ

1 голос
/ 24 мая 2010

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

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
...