2012-11-10 10 views
11
echo -n 'I hate cats' > cats.txt 
sed -i '' 's/hate/love/' cats.txt 

これは、ファイル内の単語を正しく変更しますが、ファイルの最後に改行を追加します。どうして?これは、Ubuntuなどではなく、OSXでのみ発生します。どうすれば停止できますか?sedがOSXで新しい行を追加するのはなぜですか?

+0

10.6では発生しません。あなたのバージョンだけかもしれません。 –

+2

これは10.6.8と10.7.3で発生しています。 Hm。 –

+0

編集内容が大幅に変更されました。私は以下に答えました。 –

答えて

7
echo -n 'I hate cats' > cats.txt 

このコマンドは、 'cats.txt'の内容に一重引用符で囲まれた11文字を入力します。この段階でcats.txtのサイズを確認すると11バイトになります。

sed -i '' 's/hate/love/' cats.txt 

このコマンドラインでcats.txtファイルにラインを読んで、各行は、そのような場合は「憎悪」の最初のインスタンスは、「愛」(置き換えられてきたファイルで置き換えますインスタンスが存在する場合)。重要な部分は、行が何であるかを理解することです。 sedのmanページから:

Normally, sed cyclically copies a line of input, not including its 
terminating newline character, into a pattern space, (unless there is 
something left after a ``D'' function), applies all of the commands 
with addresses that select that pattern space, copies the pattern 
space to the standard output, appending a newline, and deletes the 
pattern space. 

appending a newline部分に注意してください。あなたのシステムでは、改行が終わっていなくても、sedはあなたのファイルを1行であると解釈しています。したがって、出力は11文字に加えて改行が追加されます。他のプラットフォームでは、これは必ずしも当てはまりません。ときどきsedはファイル内の最後の行を完全にスキップします(効果的に削除します)。it is not really a line!しかし、あなたの場合、sedは基本的にあなたのためにファイルを修正しています(それに行がないファイルとして、sedの入力が壊れています)。

は、ここに詳細を参照してください:

Why should text files end with a newline?はあなたの問題への代替的なアプローチのために、この質問を参照してください:猫場合

echo -n 'I hate cats' > cats.txt 
SAFE=$(cat cats.txt; echo x) 
SAFE=$(printf "$SAFE" | sed -e 's/hate/love/') 
SAFE=${SAFE%x} 

その方法:あなたが行うことができますSED adds new line at the end

0

もう一つはこれです。 txtは改行で終わり、保存されます。そうでなければ、追加されない。

0

これは私のために働いた。中間ファイルを使用する必要はありませんでした。

OUTPUT=$(echo 'I hate cats' | sed 's/hate/love/') 
echo -n "$OUTPUT" 
+0

最初の 'echo'は' -n'を持っていません。 –

0

GNU sedは、Mac OS上で改行を追加しないことに注意してください。

+0

私はgsed(GNU sed)4.4をインストールして、改行を追加しました。 'brew install gnu-sed' –

+0

$ gsed --version gsed(GNU sed)4.4 $ gsed -i '' s/hate/love/'cats.txt $ xxd cats.txt 00000000 :4920 6c6f 7665 2063 6174 73私は猫が大好き –

0

この問題を回避する良い方法は、sedの代わりにperlを使用することです。 Perlは元のファイルにあるEOF改行、またはその欠如を尊重します。

echo -n 'I hate cats' > cats.txt 
perl -pi -e 's/hate/love/' cats.txt 
関連する問題