【问题标题】:Replacing escaped string with another escaped string with sed用 sed 用另一个转义字符串替换转义字符串
【发布时间】:2015-01-17 10:18:44
【问题描述】:

我有 .bashrc 文件,并且在文件中出现了这一行:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

我正在尝试用这个替换它:

PS1='\[\e[32m\]\A\[\e[m\] \[\e[31m\]\u\[\e[m\]@\[\e[36m\]\h\[\e[m\]\[\e[32m\]:\[\e[m\]\[\e[32m\]\w\[\e[m\]\\$ '

我尝试这样做:

sed "s#PS1='\$\{debian_chroot:\+\(\$debian_chroot\)\}\\\[\\033\[01;32m\\\]\\u@\\h\\\[\\033\[00m\\\]:\\\[\\033\[01;34m\\\]\\w\\\[\\033\[00m\\\]\\\$ '#PS1='\\\[\\e[32m\\\]\\A\\\[\\e\[m\\\] \\\[\\e\[31m\\\]\\u\\\[\\e\[m\\\]@\\\[\\e\[36m\\\]\\h\\\[\\e\[m\\\]\\\[\\e\[32m\\\]:\\\[\\e\[m\\\]\\\[\\e\[32m\\\]\\w\\\[\\e\[m\\\]\\\\\$ '#g" .bashrc

但我收到错误提示:

sed: -e expression #1, char 267: Invalid content \{\}

我会使用 sed 或任何其他 bash/dash 脚本编写方式,这样我就可以为我经常使用的系统制作自定义脚本。

感谢您的帮助。

【问题讨论】:

  • 如果这是唯一的 PS1= 行,那么只需匹配删除它并添加您想要的行。不要试图过度匹配。
  • 为什么使用 sed 而不是手动编辑文件?
  • 您可以在许多系统上使用脚本,而且总是一样的。我希望避免手动编辑,这就是原因。
  • 可悲的是,这不仅仅是 PS1= 线。我通常会这样做:D

标签: regex bash ubuntu awk sed


【解决方案1】:

这可能对你有用(GNU sed):

sed 's|PS1='\''${debian_chroot:+($debian_chroot)}\\\[\\033\[01;32m\\\]\\u@\\h\\\[\\033\[00m\\\]:\\\[\\033\[01;34m\\\]\\w\\\[\\033\[00m\\\]\\$ '\''|PS1='^''\\[\\e[32m\\]\\A\[\\e[m\\] \\[\\e[31m\\]\\u\\[\\e[m\\]@\\[\\e[36m\\]\\h\\[\\e[m\\]\\[\\e[32m\\]:\\[\\e[m\\]\\[\\e[32m\\]\\w\\[\\e[m\\]\\\\$ '\''|' file

在模式和替换中将' 替换为'\'',将\ 替换为\\,仅在模式中将[] 替换为\[\]

【讨论】:

    【解决方案2】:

    我会做什么而不是奇怪的 ANSI 代码:

    PURPLE=$(tput setaf 5)
    RED=$(tput setaf 1)
    WHITE=$(tput setaf 7)
    GREEN=$(tput setaf 2)
    YELLOW=$(tput setaf 3)
    CYAN=$(tput setaf 4)
    LIGHT_CYAN=$(tput setaf 6)
    STOP=$(tput sgr0)
    
    
    PS1="\[$PURPLE\]\u\[$WHITE\]@\[$GREEN\]\h\[$WHITE\]:\[$GREEN\]\w\[$WHITE\] $ \[$STOP\]"
    

    最后对问题的各个方面做出完整的答复,:

    sed -i '/^PS1=/d' ~/.bashrc # remove PS1 line in bashrc
    
    # now feeding bashrc with goodies :
    cat<<'EOF'>>~/.bashrc 
    PURPLE=$(tput setaf 5)
    RED=$(tput setaf 1)
    WHITE=$(tput setaf 7)
    GREEN=$(tput setaf 2)
    YELLOW=$(tput setaf 3)
    CYAN=$(tput setaf 4)
    LIGHT_CYAN=$(tput setaf 6)
    STOP=$(tput sgr0)
    
    PS1="\[$PURPLE\]\u\[$WHITE\]@\[$GREEN\]\h\[$WHITE\]:\[$GREEN\]\w\[$WHITE\] $ \[$STOP\]"
    EOF
    

    【讨论】:

    • 这个方法很好用。谢谢分享,原来的问题还是存在的。如何用我的或你的字符串替换原始字符串?
    猜你喜欢
    • 1970-01-01
    • 2012-02-17
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2011-12-21
    相关资源
    最近更新 更多