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

これを試してみてください(Chris、あなたはかなり近いです):

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を使用すると仮定すると、一重引用符内の文字列の不変拡張

問題の1つは、文字列 "/"の区切り文字( "s"コマンドの後の最初の文字)を検索または置換することを選択したことです。 sedはこれを予想したものとは異なる方法で解釈します。 「|」など、検索/置換文字列に表示されない他の文字を選択する必要があります。

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

ただし、これは特定のエラーメッセージを説明しません。

たぶんBSDバージョンを使用している可能性があります。明らかに-iを別の方法で扱います。

関連情報