【问题标题】:File contains both CRLF and also LF. I want to delete CRLF文件包含 CRLF 和 LF。我想删除 CRLF
【发布时间】:2020-02-02 03:40:56
【问题描述】:

我有一个文件,其中包含 CRLF 和 LF。我正在尝试从我的文件中删除 CRLF。我文件中的另一个预先存在的 LF,我想留在后面。我遇到了麻烦,因为它似乎 sed 无法识别 CRLF,或者因为 tr 同时删除了 CRLF 和 LF。我试过了,

tr -d '\r\n' <file.txt> file2.txt

它也会删除我文件中的 LF。我尝试仅删除 \r 但随后 CRLF 中的 LF 被抛在了后面。我希望 CRLF 被删除或至少变成一个空格,但该行没有结束。

有什么帮助吗?

我试过了:

tr -d '\r\n' <file.txt> file2.txt

我也尝试过 sed,但找不到 CRLF。

【问题讨论】:

  • "我尝试只删除 \r,但后来 LF 被遗忘了。" 这不是你想要的吗?
  • 我的意思是 CRLF 的 LF 被抛在了后面。所以 CRLF 变成了 LF,离开了行尾。我希望 CRLF 消失,或者最坏的情况变成空格 ' ' 或其他东西。
  • 那么,问题的第一句话是什么意思:I am trying to remove CRLF from my file, but keep the LF.
  • 明白了。我可以看到我不清楚。编辑为“我有一个文件,其中包含 CRLF 和 LF。我正在尝试从我的文件中删除 CRLF。我的文件中另一个预先存在的 LF,我想留在后面。”

标签: sed tr


【解决方案1】:

tr 的参数是要操作的字符 列表,而不是字符串,因此\r\n 表示\r\n,而不是\r,后跟@987654326 @。默认情况下,sed 无法删除 \r\n,因为 sed 一次读取一个 \n 终止的行,因此 seds 缓冲区中永远不会有 \r\n,只有 \n 之后的 \r 被 sed 读取行删除。

您可以使用 GNU awk 为多字符 RS 执行此操作:

awk -v RS='\r\n' -v ORS= '1' file

或使用 GNU sed 获取-z(但这会立即将整个文件读入内存):

sed -z 's/\r\n//g' file

【讨论】:

    【解决方案2】:

    这会将dos格式文件转换为linux/unix格式。

    dos2unix file
    

    【讨论】:

    • OP想要删除\r\n而不是把它变成\n
    猜你喜欢
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2016-06-05
    相关资源
    最近更新 更多