我想运行脚本以在/etc/bash.bashrc文件中搜索子字符串
PS1=
并将整行替换为:
PS1="\[\e[36m\]\h\[\e[m\]\[\e[33m\]@\[\e[m\]\[\e[33m\]\u\[\e[m\]:\[\e[32m\]\W\[\e[m\]>\\$ "
此新行旨在更改cli提示。
我已经尝试过在bash脚本中使用sed,但是替换字符串包含太多需要转义的字符,但这根本行不通。如果可以使用,我将无法使用。
这是我尝试过的代码。
#!/bin/bash
# Run this script with sudo
custom_prompt=" PS1='${debian_chroot:+($debian_chroot)}\[\e[36;40m\]\u\[\e[m\]\[\e[93m\]@\[\e[m\]\[\e[36m\]\h\[\e[m\]:\[\e[92m\]\w\[\e[m\]\[\e[92m\]\\$\[\e[m\]\[\e[93m\]>\[\e[m\$
# PS1="\[\e[36m\]\h\[\e[m\]\[\e[33m\]@\[\e[m\]\[\e[33m\]\u\[\e[m\]:\[\e[32m\]\W\[\e[m\]>\\$ "
### Setup Bash Prompt
echo "Writing the custom BASH prompt for all users to /etc/bash.bashrc"
# replace each \ for double \\ in the prompt string
sed_custom_prompt=$(<<<"$custom_prompt" sed 's/\\/\\\\/g')
# add this to /etc/bashrc for global effect
sed -i 's/\^*PS1=.*/#&\n'"$sed_custom_prompt"'/' /etc/bash.bashrc
任何要求在替换字符串中转义字符的技术都被证明是行不通的。
我需要一个简单的老式非正则表达式脚本,该脚本查找字符串并替换文件中的一行。正则表达式可以找到字符串,但会使替换混乱。
我可以找到诸如s / red / blue /之类的解决方案,但是我找不到可以找到子字符串并替换没有正则表达式的行的东西。
我不在乎它是perl,awk还是bash。我只需要一些有效的方法。
您应该逃脱每个\
,以确保它们不会丢失。
编辑:PS1字符串也应该用双引号引起来。
$ custom_prompt="\[\e[36m\]\h\[\e[m\]\[\e[33m\]@\[\e[m\]\[\e[33m\]\u\[\e[m\]:\[\e[32m\]\W\[\e[m\]>\\$ "
$ sed_custom_prompt=$(<<<"$custom_prompt" sed 's/\\/\\\\/g')
$ sed -i "s/PS1=.*/PS1=\"$sed_custom_prompt\"/" testrc
$ source testrc
laptop@user:~>$
ps.s。我个人喜欢将时间添加到PS1中,因此我知道多久前已退出命令。另外,如果您添加内容,可以立即对其计时(\D{%H}:\D{%M}
)。