我想通过bash脚本中的sed脚本编辑文件.我希望以后容易维护; 易于理解和修改.替换字符串如下所示:
PS1='\[\e[1;32m\][\u@\h \W]\$\[\e[0m\]'
Run Code Online (Sandbox Code Playgroud)
在一个完美的世界里,它会喜欢这样:
sed -i "s/^PS1.*$/PS1='\[\e[1;32m\][\u@\h \W]\$\[\e[0m\]'/g" /etc/skel/.bashrc
Run Code Online (Sandbox Code Playgroud)
问题是bash和sed正在剥离\文件中给出以下结果:
PS1='[e[1;32m][@h W]$[e[0m]'
Run Code Online (Sandbox Code Playgroud)
显然单引号不能使用.一个强力解决方案是使用转义,但为了这个工作我得到一个非常难看的线:
sed -i "s/^PS1.*$/PS1='\\\\[\\\\e[1;32m\\\\][\\\\u@\\\\h \\\\W]\\\\$\\\\[\\\\e[0m\\\\]'/g" /etc/skel/.bashrc
Run Code Online (Sandbox Code Playgroud)
我希望脚本是可读的和自包含的(不使用外部文件).以上任何替代方案?
Bash的printf可以添加必要的转义,让字符串以可读,可编辑的形式插入.
sed -i "s/^PS1.*$/$(printf "%q" "PS1='\[\e[1;32m\][\u@\h \W]$\[\e[0m\]'")/g" /etc/skel/.bashrc
Run Code Online (Sandbox Code Playgroud)
不试图将它全部放在一条线上会使整个事情变得更加清晰.
REPL=$(printf "%q" "PS1='\[\e[1;32m\][\u@\h \W]$\[\e[0m\]'")
sed -i "s/^PS1.*$/$REPL/g" /etc/skel/.bashrc
Run Code Online (Sandbox Code Playgroud)