我有一些具有这种结构的文件:
2015-03-25 17:08:17
sysUpTimeInstance 93474;^M
1.ValueforState=2500
我想替换换行符,并将第三行保留为第二行,我的意思是,输出将如下所示:
2015-03-25 17:08:17
sysUpTimeInstance 93474;1.ValueforState=2500
我尝试使用 sed:
sed 's/^M$//' myfile.dat > mynewfile.dat
但它只删除了符号^M
有什么建议么?
答案1
2个想法:
使用 sed,对于任何以回车符结尾的行,加入下一行
sed '/\r$/ {N; s/\r\n//} ' file
使用 awk,定义输入和输出的记录分隔符:
awk -v RS='\r\n' -v ORS='' 1 file
答案2
假设您的帖子中显示的^M
确实是回车符 ( \r
),则应执行以下操作:
perl -pe 's/\r\n//g'
无论您的输入包含多少行,它都会起作用:所有以 结尾的行都\r\n
将与后面的行连接。
答案3
可能会发生一些事情。
如果^M
实际不是 2 个字符^
和M
,而是某些编辑器表示回车 (CR) 字符的方式。例如。我的 Emacs 编辑器是这样显示的。该字符是end-of-line
Windows 文件系统中字符对的一部分:回车符(十六进制值 0x0D)+ 换行符(十六进制值 0x0A)。新行字符也称为换行符。 Unix 文件系统仅使用换行符来结束一行。要删除 Unix 样式行末尾不需要的回车符,sed
可以使用以下正则表达式: 注意\x0D
和\r
都适用于sed
.注:\r
是表示 的简写方式0x0D
。
sed '/\r$/{N; s/\r\n//}'
如果实际上是和^M
两个字符(当 Windows 文件错误地转换为 Unix 样式文件时有时会发生这种情况),那么您必须将 处理为特殊的正则表达式字符;您必须使用反斜杠:使用以下命令: ^
M
^
escape
\
sed
sed '/\^M$/{N; s/\^M\n//}'
答案4
如果它确实只有三行,并且您总是想加入第二行和第三行,则可以使用以下命令:
sed -e '2N' -e 's/\r\n//'
N 命令会将下一行(即第三行)添加到第二行,然后替换将删除换行符。