简体   繁体   English

用sed替换复杂的字符串

[英]replace complex string with sed

Trying to find and replace PS1="[\\u@\\h \\W]\\\\$ " with something like: PS1='\\[\\e[0;31m\\][\\u@\\h \\W]\\$\\[\\e[m\\] ' in /etc/bashrc file with sed has been failed because of two levels of interpretion: bash and sed iteself. 尝试查找PS1="[\\u@\\h \\W]\\\\$ "并将其替换PS1="[\\u@\\h \\W]\\\\$ "PS1='\\[\\e[0;31m\\][\\u@\\h \\W]\\$\\[\\e[m\\] '带有sed的/etc/bashrc文件中的PS1='\\[\\e[0;31m\\][\\u@\\h \\W]\\$\\[\\e[m\\] '已失败,因为有两种解释级别:bash和sed iteself。

How should I replace those complex strings using bash and sed? 我应该如何使用bash和sed替换那些复杂的字符串?

I built the expression piece by piece, up to the following: 我逐段构建了表达式,直到以下内容:

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

Here are some of the steps: 以下是一些步骤:

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

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


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

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

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

Here we are matching correctly the whole input, so we can start outputting: 在这里,我们正确匹配了整个输入,因此我们可以开始输出:

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

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

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM