[英]Why does sed add a new line in OSX?
echo -n 'I hate cats' > cats.txt
sed -i '' 's/hate/love/' cats.txt
這會正確更改文件中的單詞,但也會在文件末尾添加換行符。 為什么? 這只發生在OSX中,而不是Ubuntu等。我該如何阻止它?
echo -n 'I hate cats' > cats.txt
此命令將使用單引號之間的11個字符填充'cats.txt'的內容。 如果你在這個階段檢查cats.txt的大小,它應該是11個字節。
sed -i '' 's/hate/love/' cats.txt
該命令將逐行讀取cats.txt文件中的行 ,並與其中每行已通過“愛”(如果這種情況存在的話)替換成“恨”的第一個實例文件替換它。 重要的是要了解一條線是什么。 從sed手冊頁:
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仍將您的文件解釋為包含一行。 因此輸出將是11個字符,加上附加的換行符。 在其他平台上,情況不一定如此。 有時sed將完全跳過文件中的最后一行(實際上刪除它),因為它實際上不是一行 ! 但在你的情況下,sed基本上是為你修復文件(作為一個沒有行的文件,它是sed的輸入斷開)。
在此處查看更多詳細信息: 為什么文本文件以換行符結尾?
有關問題的替代方法,請參閱此問題: SED在最后添加新行
如果您需要一個不會添加換行符的解決方案,您可以使用gsed
( brew install gnu-sed
)
避免此問題的一個好方法是使用perl而不是sed。 Perl將尊重原始文件中的EOF換行符或缺少換行符換行符。
echo -n 'I hate cats' > cats.txt
perl -pi -e 's/hate/love/' cats.txt
請注意,GNU sed不會在Mac OS上添加換行符。
你可以做的另一件事是:
echo -n 'I hate cats' > cats.txt
SAFE=$(cat cats.txt; echo x)
SAFE=$(printf "$SAFE" | sed -e 's/hate/love/')
SAFE=${SAFE%x}
這樣,如果cats.txt以換行符結尾,則會被保留。 如果沒有,則不會添加一個。
這對我有用。 我沒有必要使用中間文件。
OUTPUT=$( echo 'I hate cats' | sed 's/hate/love/' )
echo -n "$OUTPUT"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.