LINUX.ORG.RU

Нужен стандартный command line regexp encoder


0

0
Существует ли в природе стандартный (как cat,vi,less) encoder для строк который не позволит строке быть интерпретированной egrep'ом как регексп?
Пример:

bash$ encode 'c++'
c\+\+

Столько лет юниксу, как будто должно такое быть
★★
мда .. интересный вопрос я задал - хочу не-regexp скормить egrep'у :))
дело в том что мне нужна от [e]grep'a опция -w котрой к сож. нет в fgrep
pvv ★★
() автор топика
Для extended regular expressions подойдет:
$ cat encode-ere
#!/usr/bin/sed -f
s/\(.\)/\\\1/g

Или grep -F ? (POSIX) А что за юникс? (гнутый grep имеет -w опцию)
myhand
()
Ответ на: комментарий от pvv
Посто задача (как я понял) чуть сложее, чем просто избежать интерпретации управляющих символов ERE (это просто - нужно заэскейпить все символы в искомой последовательности).

А здесь что-то вроде: egrep "([ ,.]$(encode str)[ ,.]|^[,. ]$(encode str)[ ,.]|$(encode str)[,. ]$)"

Где $ cat encode #!/bin/sh echo $1 | sed 's/\(.\)/\\\1/g'

myhand
()
Ответ на: комментарий от myhand
Посто задача (как я понял) чуть сложее, чем просто избежать интерпретации управляющих символов ERE (это просто - нужно заэскейпить все символы в искомой последовательности).

А здесь что-то вроде: 
egrep "([ ,.]$(encode str)[ ,.]|^[,. ]$(encode str)[ ,.]|$(encode str)[,. ]$)"

Где:
$ cat encode 
#!/bin/sh echo $1 | sed 's/\(.\)/\\\1/g' 

PS: недоформатировал -)
myhand
()
Ответ на: комментарий от pvv
#!/bin/sh
#
# fgrep-w: fgrep -w for poor children.  Use
# GNU grep instead.  Ex:
# $ echo -e "ac++\nc++b\n,c++\n c++." | fgrep-w 'c++'
# ,c++
#  c++.
#

esc_str=$(echo $1 | sed 's/\(.\)/\\\1/g')

egrep "([^[:alnum:]_]|^)$esc_str([^[:alnum:]_]|$)"
myhand
()
Ответ на: комментарий от pvv
Ну, если ты везде "рулевой" - то стоит. Он вроде и быстрее того, что в соляре.

PS: да, по задаче: правильнее эскейпить только управляющие символы: sed 's/\([].[\()*+?{}|^$]\)/\\\1/g'. ("The interpretation of an ordinary character (в ERE) preceded by a backslash ( '\' ) is undefined.")

myhand
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.