2012-02-23 13 views
1

私はsedによってその行のいずれかを変更したいが、その行の最後にバックスラッシュがある:sed:バックスラッシュとは何ですか?

Some Text that should be changed \ 

私が使用した:sedを

sed -i "s/$line/$newline/" $MyFile 

は言う:

sed: -e expression #1, char 44: unknown option to `s' 
sed: -e expression #1, char 84: unterminated `s' command 
+0

'$ line'には何がありますか? '$ newline'には何がありますか?単一のバックスラッシュと一致するようにバックスラッシュの発生を倍増させます。 –

+0

'$ line'と' $ newline'とは何ですか(それらをエコーし​​て私たちに知らせますか?) –

+0

もちろん$ lineは "変更すべきテキスト"と$ newlineは新しい行です。その行の代わりに書き込みたい –

答えて

3

sedコマンドで使用している文字列を最初にエスケープする必要があります。

line=$(echo $line | sed 's/\\/\\\\/g') 

これはそれからになります:

Some Text that should be changed \ 

へ:最後の区切り文字をエスケープからそれを停止します

Some Text that should be changed \\ 

を。

1

考えられる原因の1つは、$lineまたは$newlineに区切り文字/が含まれている可能性があります。

パターンに現れない他の区切り文字を試してください。

など。

sed -i "[email protected][email protected][email protected]" $MyFile 
sed -i "s#$line#$newline#" $MyFile 

- @ paxdiabloのコメントに従って編集してください。

変数名$lineが間違っています。代わりにパターンにする必要があります。

だから、あなたはそれがバックスラッシュ\はあなたが持っていることを考えると\\

+1

実際には、使用されている文字列 '$ line'が' \ 'で終わっているので、デリミタの変更がここで助けになるかどうかは分かりません。つまり、_any_デリミタをエスケープします。 – paxdiablo

+0

@paxdiabloあなたは正しいです。変数名 '$ line'は誤解を招きます。代わりに '$パターン 'でなければなりません。 –

3

でエスケープすべき有効なパターン、だことを確認する必要がありますので、あなたのecho "$line"利回り

line="Some Text that should be changed \\" 

Some Text that should be changed \ 

次にsedが表示されます。

sed -i "s/Some Text that should be changed \/Your replacement/" yourfile 

とバックスラッシュは、検索パターンが終了していないため、代替コマンドが不正であることを意味します。エラーメッセージに示されています。

文字列の最後に2つ目のバックスラッシュを付ける必要があります。それをやって無数の方法の一つは次のとおりです。

case "$line" in 
(*\\) line="$line\\";; 
esac 

これは単に本発明の中である...しかし、それは、文字列を修正するための任意の外部コマンドを実行していないというメリットがあります。 bashにはより多くの直接的な置換もあります。

sed -i "s/^$line$/$newline/" $myFile 

をしている限り$newlineは、任意のスラッシュもバックスラッシュも含まないように、あなたは十分に安全になります。

今、あなたは行うことができます。

関連する問題