在 Linux 上删除 Windows 换行符(sed 与 awk)

2024-10-30 08:35:00
admin
原创
233
摘要:问题描述:有一些分隔文件,其字段中间(不是行尾)的换行符位置不正确,在 Vim 中显示为 ^M。它们源自 freebcp(在 Centos 6 上)导出的 MSSQL 数据库。以十六进制转储数据显示 \r\n 模式:$ xxd test.txt | grep 0d0a 0000190: 3932 3139 3...

问题描述:

有一些分隔文件,其字段中间(不是行尾)的换行符位置不正确,在 Vim 中显示为 ^M。它们源自 freebcp(在 Centos 6 上)导出的 MSSQL 数据库。以十六进制转储数据显示 \r\n 模式:

$ xxd test.txt | grep 0d0a
0000190: 3932 3139 322d 3239 3836 0d0a 0d0a 7c43

我可以使用 awk 删除它们,但无法使用 sed 执行相同操作。

这在 awk 中有效,可以完全删除换行符:

awk 'gsub(/
/,""){printf $0;next}{print}'

但这在 sed 中却没有,而是保留了换行符:

sed -i 's/
//g'

但这似乎没有效果:

sed -i 's/
//g'

在 sed 表达式中使用 ^M(ctrl+v、ctrl+m)似乎也不起作用。

对于这类任务,sed 更容易理解,但我正在努力学习两者。我使用 sed 的方式是否不正确,或者是否存在限制?


解决方案 1:

您可以使用命令行工具dos2unix

dos2unix input

或者使用tr命令:

tr -d '
' <input >output

实际上,您可以在以下方式中进行文件格式切换vim

方法A:

:e ++ff=dos
:w ++ff=unix
:e!

方法B:

:e ++ff=dos
:set ff=unix
:w

编辑

如果要删除`
文件中的序列,请尝试以下命令vim`:

:e ++ff=unix           " <-- make sure open with UNIX format
:%s/
//g            " <-- remove all 

:w                     " <-- save file

您的awk解决方案很有效。另外两个sed解决方案:

sed '1h;1!H;$!d;${g;s/
//g}' input
sed ':A;/
$/{N;bA};s/
//g' input

解决方案 2:

我相信有些版本sed不会识别`
为字符。但是,您可以使用一项bash`功能来解决该限制:

echo $string | sed $'s/
//'

在这里,您让其将构造bash中的 '\r' 替换为实际的回车符$'...',然后将其sed作为命令传递给它。(假设您使用bash;其他 shell 应该具有类似的构造。)

解决方案 3:

`sed -e 's/
//g' input_file`

这对我有用。 -e-i命令的区别。

我还提到了,不同平台上的 see 行为有所不同。我的是:`sed --version
This is not GNU sed version 4.0`

解决方案 4:

另一种方法

awk 1 RS='
' ORS=
  • 将记录分隔符设置为`
    `

  • 将输出记录分隔符设置为空字符串

  • 1始终为真,并且在没有操作块的情况下{print}使用

解决方案 5:

我发现整个文件显示为一行,其中有“^M”符号,而不是新行。对我而言,唯一有效的解决方案是在 vi 中输入此命令(不要复制和粘贴)

:%s/
/
/g

然后使用“ZZ”保存并退出

此命令告诉 Vim 将每个回车符(\r,显示为 ^M)替换为换行符。% 告诉 Vim 将命令应用于文件中的每一行。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用