Unix Shell CRLF 将替换为空格

Unix Shell CRLF 将替换为空格

我正在为 Oracle SQL Loader 使用以下输入。我从服务下载的 CSV 文件现在有一个 CRLF

我尝试过

dos2unix 
tr '\n' ',' < input.txt > output.txt
awk '{printf "%s\r\n", $0}' file

但没有运气。

样本数据 :

"ID","NAME","GROUP","Free Text [CR][LF]
[CR][LF]
[CR][LF]
[CR][LF]
"
"ID1","NAME1","GROUP1","Free Text1 [CR][LF]
"

期望的输出:

"ID","NAME","GROUP","Free Text"
"ID1","NAME1","GROUP1","Free Text1"

请建议一个有帮助的代码或命令

提前致谢

答案1

$ perl -pe 'while(m/\r$/) { $_ .= readline }; s/\r\n//g' rgram.txt
"ID","NAME","GROUP","Free Text"
"ID1","NAME1","GROUP1","Free Text1"

\r$这将以 CRLF (或)结尾的连续行连接\r\n成一长行,然后从该行中剥离所有 CRLF 对并打印它。

修改后的输入将打印到 stdout,该输出可以重定向到另一个文件。或者使用perl-i选项就地修改原始文件:

$ perl -i.bak -pe 'while(m/\r$/) { $_ .= readline }; s/\r\n//g' rgram.txt

这将保持原来的rgram.txt.bak

我不喜欢使用-i,我宁愿将标准输出重定向到,例如rgram.new。写入标准输出更加通用(您可以将其传输到其他程序中,或者在进程或命令替换等中使用它),并且错误破坏原始文件的风险较小。


rgram.txt是一个文本文件,包含问题中描述的示例数据:

$ sed -n l rgram.txt 
"ID","NAME","GROUP","Free Text\r$
\r$
\r$
\r$
"$
"ID1","NAME1","GROUP1","Free Text1\r$
"$

答案2

sed 's/"$//' rgram.csv | sed 's/$/"/' | sed '/^"$/d' > rgram.new.csv

我首先从文件中删除了最后一个“字符,然后将其添加回来,然后删除以”开头的行。

答案3

我看到您想删除 CRLF 序列,但保留 LF 而不单独前面的 CR,所以:

perl -pe 's/\r\n//' < input.txt > output.txt

或者:

gawk -v RS='\r\n' -v ORS= 1 < input.txt > output.txt

相关内容