grep вопрос, используя обратную косую черту - PullRequest
3 голосов
/ 23 апреля 2011

У меня есть следующий файл:

asdasd
asd
asd
incompatible:svcnotallowed:svc\:/network/bmb/clerver\:default
incompatible:svcnotallowed:svc\:/network1/bmb/clerver\:default
incompatible:svcnotallowed:svc\:/network2/bmb/clerver\:default
asdasd
asd
asd
as

А теперь предположим, что у меня есть две переменные v1="incompatible:svcnotallowed:" и v2="svc\:/network1/bmb/clerver\:default".Я хотел бы искать весь файл, используя v1 и v2.Я знаю, что это проблема, вызванная тем, что в файле есть '\'.Я просто не знаю, как это устранить.Я пытался сохранить v1 и v2 (как переменное содержимое, так и использование grep), используя одинарные кавычки, но тщетно.

Это серия команд, которые я пробовал:

grep "$v1$v2" file
grep '$v1$v2' file

Мне нужночтобы это работало в KSH , пожалуйста, дайте мне знать, как правильно использовать grep в этом сценарии.Спасибо.

Ответы [ 2 ]

7 голосов
/ 23 апреля 2011

grep -F "$v1$v2" file должен сделать свое дело - с опцией -F он обрабатывает шаблон как фиксированную строку, поэтому обратные слеши не интерпретируются как экранирование или обратные ссылки.

Но fgrep "$v1$v2" fileвероятно, будет самым портативным решением.Как отмечает tomkaith13 в своем комментарии, опция -F для grep не поддерживается повсеместно.В Solaris по умолчанию grep не поддерживает -F, но версия в / usr / xpg4 / bin поддерживает.

2 голосов
/ 23 апреля 2011

Поскольку вы используете ksh, вы можете просто использовать его для чтения файлов

v1="incompatible:svcnotallowed:"
v2="svc\:/network1/bmb/clerver\:default"
while read -r line
do
    case "$line" in
        "$v1$v2" ) echo "$line";;
    esac
done < file
...