在 Linux 上删除 Windows 换行符(sed 与 awk)
- 2024-10-30 08:35:00
- admin 原创
- 66
问题描述:
有一些分隔文件,其字段中间(不是行尾)的换行符位置不正确,在 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 将命令应用于文件中的每一行。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件