Использование sed в длинной строке, включая ключевые слова условий и специфические символы c - PullRequest
0 голосов
/ 07 мая 2020

У меня есть эта строка в моем файле .bash_profile:

if [ -f ~/.bash_profile.tomcat_8.5 ]; then . ~/.bash_profile.tomcat_8.5; fi

И я хотел бы заменить всю строку на

if [ -f ~/.bash_profile.tomcat ]; then . ~/.bash_profile.tomcat; fi

У меня были проблемы со всеми /, затем я узнал, проверяя этот сайт, вы можете использовать любой разделитель с sed, что очень удобно. Но все равно не могу делать то, что хочу.

Вот что я пробовал, используя разделитель +:

sed -i "s+if [ -f ~/.bash_profile.tomcat_8.5 ]; then . ~/.bash_profile.tomcat_8.5; fi+if [ -f ~/.bash_profile.tomcat ]; then . ~/.bash_profile.tomcat; fi+" /tmp/.bash_profile

Я даже пробовал использовать переменные:

Delete='if [ -f ~/.bash_profile.tomcat_8.5 ]; then . ~/.bash_profile.tomcat_8.5; fi'

Add='if [ -f ~/.bash_profile.tomcat ]; then . ~/.bash_profile.tomcat; fi'

sed -i "s+$Delete+$Add+g" /tmp/.bash_profile

Я пробовал использовать {} вокруг переменных , с одинарными кавычками, двойными кавычками. Интересно, это основная проблема c, которую я не могу решить, потому что мне не хватает чего-то простого, или это что-то более глубокое из-за всех c ключевых слов / символов.

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

1 Ответ

0 голосов
/ 07 мая 2020

[ ] имеют особое значение в регулярных выражениях (а также . и в расширенном регулярном выражении также +, но здесь это не влияет). Прочтите о регулярных выражениях . Для экранирования специальных символов используйте backsla sh.

Do:

sed 's!something \[ something \] something\.something!!'
...