Bash CRLF-文档末尾的新行
我在StackOverflow和谷歌叔叔那里看过很多问题,但不知怎么的,我还是无法破解 我有一个由SSRS自动导出的CSV文件。不幸的是,导出插件很旧,它们在文件末尾放了两个换行符和回车符:Bash CRLF-文档末尾的新行,bash,shell,sed,newline,Bash,Shell,Sed,Newline,我在StackOverflow和谷歌叔叔那里看过很多问题,但不知怎么的,我还是无法破解 我有一个由SSRS自动导出的CSV文件。不幸的是,导出插件很旧,它们在文件末尾放了两个换行符和回车符: 00000c0:6b7c 3230 2d46 6562 2d31 360d 0a0d 0a k | 2016年2月20日…… 我尝试了许多sed替换,但似乎只删除了一行 例如,简单化 sed-i'/^\s*$/d' 还尝试将\s替换为[:space:](也可以,但仅在一行上) 在此之后,十六进制转储的最后一
00000c0:6b7c 3230 2d46 6562 2d31 360d 0a0d 0a k | 2016年2月20日……
我尝试了许多sed
替换,但似乎只删除了一行
例如,简单化
sed-i'/^\s*$/d'
还尝试将\s
替换为[:space:]
(也可以,但仅在一行上)
在此之后,十六进制转储的最后一行如下所示:
00000c0:6b7c 3230 2d46 6562 2d31 360d 0a k | 2016年2月20日..
我试过这样的方法:
sed-i的/\x0D\X0A//g'
但是这并不能在最后同时替换两个0d0a
任何帮助都将不胜感激以下命令适用于您:
sed 's/\x0d//;/^$/d'
我正在删除所有回车字符并删除空行
试试看,像这样:
echo -e "foo\x0a\x0d\x0a" | sed 's/\x0d//;/^$/d' | xxd
00000000: 666f 6f0a foo.
“忘了最后两行吧。”
“哦,ed(或ex/vi/vim),干掉最后两行。”
“我应该杀了这个吗?”
“维姆,你能自己测试一下吗?”
“PERL?”
请看:这很有趣,我使用了它,hexdump的最后一行现在看起来像:
00000f0:2043 6f6f 6b7c 3033 2d4d 6172 2d31 360a Cook | 03-Mar-16。
为什么第一个x0a会消失而第二个不会消失?这是因为sed
通常会“看不到”换行符。它按每条线路运行。最后一行以行分隔符结尾也是正确的。在类UNIX系统上,另一个上的回车字符将不会被识别为行分隔符。这就是为什么sed可以删除它。但是如果文件的最终目标是基于Windows的,则在那里运行的进程将LF视为新行,对吗?不,如果文件的最终目标是Windows,则需要将所有行尾转换为\0xd\0xa
。在这种情况下,sed'/^\x0d$/d'
应该可以工作。它只是删除了尾随的空行,但保持了windows回车的完整性。问题是我不希望这些行的结尾位于文件的末尾,因此基本上必须从文件的末尾删除部分\0xd\0xa\0xd\0xa
。
# gnu!
head -n -2 foo.csv > foo.csv.new
ed foo.csv << EOF
$
-1,$d
w foo.csv.new
q
EOF
# ex/vi/vim: change this to vi -c "the whole trunk".
sed -i -e '$d' foo.csv; sed -i -e '$d' foo.csv
[[ $(tail -n 2 foo.csv) == $'\r\n\r\n' ]]
# I don't write vimscript.
# I don't write Perl.