Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash CRLF-文档末尾的新行_Bash_Shell_Sed_Newline - Fatal编程技术网

Bash CRLF-文档末尾的新行

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:](也可以,但仅在一行上) 在此之后,十六进制转储的最后一

我在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 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.