如何在嵌入在bash脚本中的sed脚本中转义反斜杠

hau*_*ech 8 bash escaping sed

我想通过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)

我希望脚本是可读的和自包含的(不使用外部文件).以上任何替代方案?

hau*_*ech 5

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)