我正在尝试将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\]\$
(后跟空白)。
答案 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