簡體   English   中英

為什么sed在OSX中添加新行?

[英]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在最后添加新行

如果您需要一個不會添加換行符的解決方案,您可以使用gsedbrew 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM