2015-07-07 5 views
0

Пытается найти и заменить PS1="[\[email protected]\h \W]\\$ " с чем-то вроде: PS1='\[\e[0;31m\][\[email protected]\h \W]\$\[\e[m\] ' в /etc/bashrc файл с sed был провален из-за двух уровней интерпретации: bash и sed iteself.заменить сложную строку с sed

Как заменить эти сложные строки с помощью bash и sed?

+0

Что вы подразумеваете под «двумя уровнями толкования»? Единственная проблема, с которой я мог столкнуться, заключается в использовании обоих типов котировок внутри вашего sed. Но вы можете обойти это, просто поместив его в файл сценария. – 123

+0

Я имею в виду, что есть символы, которые должны быть экранированы из bash и символов, которые должны быть экранированы от sed в этой команде, и когда я выполняю эту команду в BASH, возникла проблема! –

ответ

1

Я построил выражение по частям, до следующего:

sed 's/PS1="\[\\[email protected]\\h \\W]\\\\\$ "/PS1='\''\\[\\e[0;31m\\][\\[email protected]\\h \\W]\\$\\[\\e[m\\] '\'/ 

Вот некоторые из шагов:

echo 'PS1="[\[email protected]\h \W]\\$ "' \ 
    | diff <(sed s/a/b/) 
      <(PS1=\''\[\e[0;31m\][\[email protected]\h \W]\$\[\e[m\] '\') 

echo 'PS1="[\[email protected]\h \W]\\$ "' \ 
    | diff <(sed 's/PS1="\[//') 
      <(echo PS1=\''\[\e[0;31m\][\[email protected]\h \W]\$\[\e[m\] '\') 


echo 'PS1="[\[email protected]\h \W]\\$ "' \ 
    | diff <(sed 's/PS1="\[\\[email protected]\\h//') 
      <(echo PS1=\''\[\e[0;31m\][\[email protected]\h \W]\$\[\e[m\] '\') 

echo 'PS1="[\[email protected]\h \W]\\$ "' \ 
    | diff <(sed 's/PS1="\[\\[email protected]\\h \\W]//') 
      <(echo PS1=\''\[\e[0;31m\][\[email protected]\h \W]\$\[\e[m\] '\') 

echo 'PS1="[\[email protected]\h \W]\\$ "' \ 
    | diff <(sed 's/PS1="\[\\[email protected]\\h \\W]\\\\\$ "//') 
      <(echo PS1=\''\[\e[0;31m\][\[email protected]\h \W]\$\[\e[m\] '\') 

Здесь мы правильно соответствие всего ввода, так что мы можем начало работы:

echo 'PS1="[\[email protected]\h \W]\\$ "' \ 
    | diff <(sed 's/PS1="\[\\[email protected]\\h \\W]\\\\\$ "/PS1='\''/') 
      <(echo PS1=\''\[\e[0;31m\][\[email protected]\h \W]\$\[\e[m\] '\') 

echo 'PS1="[\[email protected]\h \W]\\$ "' \ 
    | diff <(sed 's/PS1="\[\\[email protected]\\h \\W]\\\\\$ "/PS1='\''\\[\\e/') 
      <(echo PS1=\''\[\e[0;31m\][\[email protected]\h \W]\$\[\e[m\] '\') 

echo 'PS1="[\[email protected]\h \W]\\$ "' \ 
    | diff <(sed 's/PS1="\[\\[email protected]\\h \\W]\\\\\$ "/PS1='\''\\[\\e[0;31m\\][\\[email protected]\\h \\W]\\$\\[\\e[m\\] /') 
      <(echo PS1=\''\[\e[0;31m\][\[email protected]\h \W]\$\[\e[m\] '\') 

echo 'PS1="[\[email protected]\h \W]\\$ "' \ 
    | diff <(sed 's/PS1="\[\\[email protected]\\h \\W]\\\\\$ "/PS1='\''\\[\\e[0;31m\\][\\[email protected]\\h \\W]\\$\\[\\e[m\\] '\'/) 
      <(echo PS1=\''\[\e[0;31m\][\[email protected]\h \W]\$\[\e[m\] '\') 
+1

Это глазное заболевание: D –

+0

Спасибо дорогой хороба за вашу большую тяжелую работу. –

Смежные вопросы