【问题标题】:Replace line with double quotes用双引号替换行
【发布时间】:2023-03-25 16:48:01
【问题描述】:

我想在 OpenBox 启动时用双引号替换一行,比如:

(sleep 2 && terminator -e "htop") &

#(sleep 2 && terminator -e "htop") &

我使用这个命令,但是它不起作用:

sed -i "s/(sleep 2 && terminator */#(sleep 2 && terminator -e "htop") &/" ~/.config/openbox/autostart

它给了我这个错误:

`sed: -e expression #1, char : unknown`

【问题讨论】:

    标签: linux bash unix command-line sed


    【解决方案1】:

    即使它使用双引号对我有用,您也应该将命令放在单引号中以避免转义内部双引号的问题。

    然后,您必须转义&:它代表替换字符串中的“重复整个匹配”。

    sed -i 's/(sleep 2 && terminator */#(sleep 2 \&\& terminator -e "htop") \&/' ~/.config/openbox/autostart
    

    或者,因为你基本上只是在前面加上 # 并保持该行不变,你可以使用

    sed -i '/(sleep 2 && terminator -e "htop") &/s/^/#/' ~/.config/openbox/autostart
    

    意思是“如果该行匹配,则在前面加上#”。

    【讨论】:

      【解决方案2】:

      替换字符串中的 & 号会调用搜索字符串中的模式。

      所以你可以这样做:

      sed -i "s/(sleep 2 && terminator */#&/" ~/.config/openbox/autostart
      

      此外,您可以在外部使用单引号,在内部使用双引号,或者在内部双引号使用 \"。

      sed  's/(sleep 2 && terminator -e "htop") &/#(sleep 2 \&\& terminator -e "htop") \&/' ~/.config/openbox/autostart
      

      sed -i "s/(sleep 2 && terminator -e \"htop\") &/#(sleep 2 \&\& terminator -e \"htop\") \&/" ~/.config/openbox/autostart
      

      【讨论】:

      • 非常感谢工作,如果我想将操作从#(sleep 2 && terminator -e "htop") 反转为(sleep 2 && terminator -e "htop")
      • 这个怎么样:sed -i "s/#\((sleep 2 && terminator *\)/\1/" ~/.config/openbox/autostart
      【解决方案3】:

      我会使用以下方法来实现目标

      sed -i 's/(sleep 2 && terminator -e "htop") &/#&/' ~/.config/openbox/autostart
      

      整个表达式周围的单引号使您无需在内部和@BenjaminW 中转义双引号。提到,替换部分中的&代表整个匹配,所以要在匹配前面加上#,那么你需要在替换部分使用/#&/

      要恢复操作,我将使用以下内容:

      sed -i 's/#\((sleep 2 && terminator -e "htop") &\)/\1/' ~/.config/openbox/autostart
      

      另请注意,-i 仅受相对现代的 sed 支持,正如this question 所说

      【讨论】:

      • 非常感谢工作,如果我想将操作从#(sleep 2 && terminator -e "htop") 反转为(sleep 2 && terminator -e "htop")
      • 澄清一下,-i 在 GNU sed 和 BSD sed 中都受支持(即在 OS X、FreeBSD 等中),但两者之间的工作方式略有不同。有关详细信息,请参阅您的手册页。
      猜你喜欢
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多