为什么sed在看到我的PS1提示时遇到麻烦?

时间:2019-04-05 17:25:32

标签: bash ps1

我正在尝试将sed用作root,以更改默认的PS1

前两行只是为了确保语法结构正确,并查看引号是否有所不同, 连续运行它们使我可以在文件顶部附近更改注释,然后再将其更改回。 在nano中打开文件确认更改是有效的,应排除“写权限”。

sed -i 's/If not running interactively,/stringtoreplaceitwith/' /etc/skel/.bashrc
sed -i "s/stringtoreplaceitwith/If not running interactively,/" /etc/skel/.bashrc
sed -i "s/\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ /Replace PS1/" /etc/skel/.bashrc

我不确定这是否与字符串的结构有关, 但是由于某种原因,它找不到我想要替代的东西。

\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ 

(后跟空白)。

sedPS1

1 个答案:

答案 0 :(得分:1)

您的问题是由于引用和转义。让我们减少您要替换的字符串:

\w\[\033[00m\]\$

(后跟空白)–包含所有困难,但较不冗长。

要对此进行匹配,我们必须

  • 转义所有反斜杠:\w变成\\w等。
  • 转义[],因为它们特殊于sed:[变成\[,而\[变成\\\[(转义反斜杠,转义了[
  • 转义$\$变成\\\$

然后,我们必须在sed命令周围使用单引号,以便外壳程序不修改字符串:

$ sed 's/\\w\\\[\\033\[00m\\\]\\\$ /Replace PS1/' <<< '\w\[\033[00m\]\$ '
Replace PS1

它也可以使用双引号,但是我们必须为外壳加上另一转义:\[变成\\\[(转义为sed)变成{ {1}}(针对外壳进行了转义),依此类推。

\\\\\\[

出于明显的原因,双引号仅在使用变量时才有意义。

最后,输入您的实际字符串:

$ sed "s/\\\\w\\\\\\[\\\\033\\[00m\\\\\\]\\\\\\$ /Replace PS1/" <<< '\w\[\033[00m\]\$ '
Replace PS1