Bash Shell脚本:结尾不以^ M结尾的行

时间:2018-08-03 22:35:20

标签: linux shell

这又是一个与Unix和Windows中的行尾字符有关的问题。

我有一个sql提取,其中某些字段可以包含带有换行符的文本。

当我将此提取物带到linux机器并在VI中使用:se list选项设置将其打开时,我看到如下文本:

   1 some broken Text part 1 - Line1$
   2 other broken text part 2 -line 2^M$
   3 good line ^M$

我需要检测未以回车(CR)或^ M结尾的行,并查看其是否包含具有换行符的值。

在上面的摘录中,基本上我需要将第1行和第2行连接起来,只想出一条线

1 'some broken Text part 1 - Line1 other broken text part 2 -line 2^M$

第3行没有任何变化,该行将成为文件的第2行。

我尝试使用tr删除\ n,但是整个文件在VI中仅占1行。 删除\ n之后,我尝试用\ r \ n替换\ r,但是它在文件中引入了意外的行为。

任何能帮助您解决此问题的帮助。

2 个答案:

答案 0 :(得分:-1)

您可以将\n替换为空格,将\r替换为\n

$ printf 'some broken Text part 1 - Line1
other broken text part 2 -line 2\r
goodline\r\n' > file.txt

$ cat -vE file.txt
some broken Text part 1 - Line1$
other broken text part 2 -line 2^M$
goodline^M$

$ tr '\n\r' ' \n' < file.txt
some broken Text part 1 - Line1 other broken text part 2 -line 2
 goodline

答案 1 :(得分:-1)

以下是绝招:

tr -d '\n' < file.txt > step1-file.txt
sed -i -e 's/\r/\r\n/g' step1-file.txt

某种程度上,我之前尝试使用的以下perl行引入了意外行为。

perl -pi -e 's/\r/\r\n/' step1-file.txt