要删除所有换行,请说:
tr -d '\n' < days.txt
cat days.txt | tr -d '\n'
但是如何使用tr
仅删除文本文件末尾的换行符?
我不确定只指定最后一个。
答案 0 :(得分:35)
比公认的解决方案更简单的解决方案:
truncate -s -1 <<file>>
来自截断手册页:
-s, --size=SIZE
set or adjust the file size by SIZE
SIZE may also be prefixed by one of the following modifying characters:
'+' extend by, '-' reduce by, '<' at most, '>' at least, '/' round down
to multiple of, '%' round up to multiple of.
答案 1 :(得分:22)
利用以下事实:a)换行符位于文件的末尾,b)字符大1字节:使用truncate
命令将文件缩小一个字节:
# a file with the word "test" in it, with a newline at the end (5 characters total)
$ cat foo
test
# a hex dump of foo shows the '\n' at the end (0a)
$ xxd -p foo
746573740a
# and `stat` tells us the size of the file: 5 bytes (one for each character)
$ stat -c '%s' foo
5
# so we can use `truncate` to set the file size to 4 bytes instead
$ truncate -s 4 foo
# which will remove the newline at the end
$ xxd -p foo
74657374
$ cat foo
test$
您还可以将大小调整和数学滚动到一行命令中:
truncate -s $(($(stat -c '%s' foo)-1)) foo
答案 2 :(得分:19)
如果您确定最后一个字符是换行符,则非常简单:
head -c -1 days.txt
head -c -N
表示除最后N个字节外的所有内容
答案 3 :(得分:11)
我认为你最好的选择是Perl:
perl -0pe 's/\n\Z//' days.txt
-0
导致perl将整个文件视为一个大字符串。 -p
告诉它在运行程序后将该字符串打印出来。并且-e
说“这是要运行的程序”。
正则表达式\n\Z
匹配换行符,但前提是它是字符串中的最后一个字符。并且s/\n\Z//
表示要删除这样的换行符,删除它。
上述命令输出文件的新版本,但您可以通过添加-i
(“就地”)选项来修改现有版本,也可以选择使用后缀来命名修改文件之前备份的文件副本:
perl -i.bak -0pe 's/\n\Z//' days.txt
此解决方案是安全的,因为如果最后一个字符不换行符,则不会触及它。其他解决方案只是删除最后一个字节,无论什么可能会破坏这样的文件。
答案 4 :(得分:6)
尝试此命令:
sed '$ { /^$/ d}' days.txt
您可以将其读作:&#34;检查最后一行是否为空行。如果是这样,请删除此行&#34;。 我测试了两种情况:首先是一个文件在末尾有一个新行,另一个时间用一个文件以其他东西结尾。
答案 5 :(得分:0)
另一种Sed解决方案:
sed -z s/.$// days.txt
使用-z
选项,它将文件解释为单个长行(换行符嵌入为\n
),然后s
与单个字符.
匹配,行尾(=文件末尾)$
,并将其更改为空。无需引用命令。
如果不确定最后一个字符是换行符,则可以执行以下任一操作:
sed -z s/\\n$// days.txt
sed -z 's/\n$//' days.txt