用双引号

时间:2016-04-16 00:12:58

标签: linux bash unix command-line sed

我想在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`

3 个答案:

答案 0 :(得分: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

表示“如果该行匹配,则前置#”。

答案 1 :(得分:0)

我会使用以下内容来实现目标

FXMLLoader loader = new FXMLLoader(getClass().getResource("path/to/fxml/file.fxml"));
Parent root = loader.load();
Introduction controller = loader.getController();
controller.setText("Hello World!");

Scene scene = new Scene(root);

// etc...

整个表达式周围的单引号使您无需在内部转义双引号,并将其作为@BenjaminW。提到,替换部分中的sed -i 's/(sleep 2 && terminator -e "htop") &/#&/' ~/.config/openbox/autostart 代表整个匹配,因此要在&之前添加匹配,您需要在替换部分中使用#

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

/#&/

另请注意,sed -i 's/#\((sleep 2 && terminator -e "htop") &\)/\1/' ~/.config/openbox/autostart 仅由相对现代的sed支持,this question告诉

答案 2 :(得分:0)

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

所以你可以这样做:

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