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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.