搜索子字符串,然后在没有正则表达式的文件中替换行

问题描述 投票:0回答:1

我想运行脚本以在/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。我只需要一些有效的方法。

bash perl search str-replace
1个回答
0
投票

您应该逃脱每个\,以确保它们不会丢失。

编辑: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})。

© www.soinside.com 2019 - 2024. All rights reserved.