如何在 sed 中用美元符号替换字符串?

如何在 sed 中用美元符号替换字符串?

我想替换这个字符串:

export TODO_FILE="$TODO_DIR/todo.txt

和:

export TODO_FILE="$TODO_DIR/writing.txt"

在文件中~/.todo/config。我已经运行它:

sed -i 's/export TODO_FILE="$TODO_DIR/todo.txt"/export TODO_FILE="$TODO_DIR/writing.txt"/g' ~/.todo/config

但它说:

sed: -i may not be used with stdin

我应该怎么办?

答案1

试试这个(克里斯,你已经很接近了):

sed -i '' 's|export TODO_FILE="$TODO_DIR/todo.txt"|export TODO_FILE="$TODO_DIR/writing.txt"|g' ~/.todo/config

答案2

最好先匹配该线,然后替换该部分

sed -i '/export TODO_FILE/ s/todo.txt/writing.txt/' ~/.todo/config

当路径变量太长时,它就会变得很短。

正如前面的答案中提到的,在处理路径时使用其他分隔符。

答案3

我不认为问题在于美元符号,因为它位于单引号内。假设你正在使用 bash,单引号内的字符串不可变扩展

您的问题之一是您选择了查找/替换字符串中存在的分隔符(“s”命令后的第一个字符)——“/”。 sed 对此的解释与您的预期不同。您应该选择一个不会出现在查找/替换字符串中的不同字符,例如“|”。

sed -i 's|export TODO_FILE="$TODO_DIR/todo.txt"|export TODO_FILE="$TODO_DIR/writing.txt"|g' ~/.todo/config

但是,这并不能解释您的特定错误消息。

也许你正在使用 BSD 版本显然以不同的方式对待 -i

相关内容