首页 > 解决方案 > Bash Shell 脚本:连接不以 ^M 结尾的行

问题描述

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

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

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

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

我需要检测不以 CARRIAGE RETURN (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 替换为 \r\n ,但它在文件中引入了意外行为。

任何解决此问题的帮助将不胜感激。

标签: linuxshell

解决方案


你可以\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

推荐阅读