我想替换这个字符串:
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?