LINUX.ORG.RU

Как заэкранировать regexp для sed


0

0

Имеется файл:

file.txt: /home/dima /home/petya.txt /var/vasya

Хочу удалить строку которая содержит: "e/petya.txt"

script.sh: V="e/petya.txt" # не постоянная cat file.txt | sed "/${V}/d" # не работает так как в $V есть "/" и "."

Как вызвать sed чтобы $V воспринималась как строка?

Так не хочю извращатся: V="e/petya.txt" V=$(echo "$V" |sed 's/\//\\\//g' | sed 's/\.\\./g') cat file.txt | sed "/${V}/d"

anonymous

Имеется файл:

file.txt:
/home/dima
/home/petya.txt
/var/vasya

Хочу удалить строку которая содержит: "e/petya.txt"

script.sh:
V="e/petya.txt" # не постоянная
cat file.txt | sed "/${V}/d" # не работает так как в $V есть "/" и "."

Как вызвать sed чтобы $V воспринималась как строка?

Так не хочю извращатся:
V="e/petya.txt"
V=$(echo "$V" |sed 's/\//\\\//g' | sed 's/\.\\./g')
cat file.txt | sed "/${V}/d"

anonymous
()
Ответ на: комментарий от anonymous

Имеется файл:

file.txt:
/home/dima
/home/petya.txt
/var/vasya

Хочу удалить строку которая содержит: "e/petya.txt"

script.sh:
V="e/petya.txt" # не постоянная
cat file.txt | sed "/${V}/d" # не работает так как в $V есть "/" и "."

Как вызвать sed чтобы $V воспринималась как строка?

Так не хочю извращатся:
V="e/petya.txt"
V=$(echo "$V" |sed 's/\//\\\//g' | sed 's/\./\\./g')
cat file.txt | sed "/${V}/d"

PS: Маленько подправил

anonymous
()
Ответ на: комментарий от Slavaz

sed "@${V}@d"
Ошибка:
sed: -e выражение #1, символ 1: неизвестная команда: `@'

sed "/${V}/d"
Ошибка:
sed: -e выражение #1, символ 0: непарный символ `{'

Версия sed 4.1.5

anonymous
()
Ответ на: комментарий от Slavaz

>sed '/'$(echo $V| sed 's@/@\/@')'/d'

Тоже ругается на символ @

anonymous
()
Ответ на: комментарий от anonymous

> cat file.txt | fgrep -v "$V"

Спасибо работает

anonymous
()
Ответ на: комментарий от anonymous

Может глупый вопрос, Но где про этот трюк написано?

anonymous
()

Вместо символа @ часто удобно использовать | Его не надо экранировать.
Присоединяюсь к вопросу о том, где про это написано. В manе вроде нету.

ksicom
()
Ответ на: комментарий от ksicom

кроме man есть ещё info :)

$ info sed addresses

`\%REGEXP%'
     (The `%' may be replaced by any other single character.)

     This also matches the regular expression REGEXP, but allows one to
     use a different delimiter than `/'.  This is particularly useful
     if the REGEXP itself contains a lot of slashes, since it avoids
     the tedious escaping of every `/'.  If REGEXP itself includes any
     delimiter characters, each must be escaped by a backslash (`\').

Eshkin_kot ★★
()
Ответ на: комментарий от Eshkin_kot

в стандартах тоже написано:

* In a context address, the construction "\cBREc", where c is any character other than backslash or <newline>, shall be identical to "/BRE/".

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