Skip to content
Advertisement

Replacement of PS1 variable in .bashrc using Sed or Perl

I am trying to replace a line in file and am running in to issues.

Original File:

export PS1='h:w$ '

Command I am running:

perl -pi -e 's~PS1.*~PS1="n[e[32;1m][[e[37;1m]u@h:[e[37;1m]w[e[32;1m]]\$ [e[0m]~g' ~/.bashrc

Error message:

syntax error at -e line 1, near "e["
Execution of -e aborted due to compilation errors.

I also tried sed:

sed -i 's~PS1.*~PS1="n[e[32;1m][[e[37;1m]u@h:[e[37;1m]w[e[32;1m]]\$ [e[0m]~g' ~/.bashrc

Result with Sed:

export PS1="
[e[32;1m][[e[37;1m]@h:[e[37;1m]w[e[32;1m]]$ [e[0m]

Expected Result File:

export PS1="n[e[32;1m][[e[37;1m]u@h:[e[37;1m]w[e[32;1m]]\$ [e[0m]"

End Result

This doesn’t have much to do with the question except to show folks what the PS1 will look like when working properly

enter image description here

Advertisement

Answer

For sed, you have to escape each backslash with another backslash for them to be treated literally.

The s command additionally requires you to escape the delimiter and &, so it’s easier to use the c command, so that doubling backslashes is the only requirement:

sed -i '/PS1/c
export PS1="\n\[\e[32;1m\][\[\e[37;1m\]\u@\h:\[\e[37;1m\]\w\[\e[32;1m\]]\\$ \[\e[0m\]"
' file.txt

If file.txt contains:

hello
PS1=foo
world

then after running this command, it will contain:

hello
export PS1="n[e[32;1m][[e[37;1m]u@h:[e[37;1m]w[e[32;1m]]\$ [e[0m]"
world
User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement