sed:如何用“\ r”replaceCR和/或LF“\ n”,所以任何文件都在一行中

我有类似的文件

AAA

BBB

CCC

我需要他们sed进入aaa\r\nbbb\r\nccc

它应该适用于unixWindows,相应地用\r\r\nreplace它们

问题是sed在行尾添加了\n ,但保持行分隔。 我该如何解决?

Solutions Collecting From Web of "sed:如何用“\ r”replaceCR和/或LF“\ n”,所以任何文件都在一行中"

这两个命令一起应该做你想要的:

 sed ':a;N;$!ba;s/\r/\\r/g' sed ':a;N;$!ba;s/\n/\\n/g' 

通过两个输入文件来获得你想要的输出。 这可能是将它们组合成一个表达式的一种方式。

从这个问题被盗和修改:

如何使用sed替换换行符(\ n)?

可以合并sed中的行,但是我个人认为需要改变换行符,这意味着现在是放弃sed并使用更强大的语言的时候了。 你想要的是一行perl:

 perl -e 'undef $/; while (<>) { s/\n/\\n/g; s/\r/\\r/g; print $_, "\n" }' 

或者12行python:

 #! /usr/bin/python import fileinput from sys import stdout first = True for line in fileinput.input(mode="rb"): if fileinput.isfirstline() and not first: stdout.write("\n") if line.endswith("\r\n"): stdout.write(line[:-2] + "\\r\\n") elif line.endswith("\n"): stdout.write(line[:-1] + "\\n") elif line.endswith("\r"): stdout.write(line[:-1] + "\\r") first = False if not first: stdout.write("\n") 

或者10行C来完成这个工作,但是更多的是因为你必须自己处理argv

 #include <stdio.h> void process_one(FILE *fp) { int c; while ((c = getc(fp)) != EOF) if (c == '\n') fputs("\\n", stdout); else if (c == '\r') fputs("\\r", stdout); else putchar(c); fclose(fp); putchar('\n'); } int main(int argc, char **argv) { FILE *cur; int i, consumed_stdin = 0, rv = 0; if (argc == 1) /* no arguments */ { process_one(stdin); return 0; } for (i = 1; i < argc; i++) { if (argc[i][0] == '-' && argc[i][1] == 0) { if (consumed_stdin) { fputs("cannot read stdin twice\n", stderr); rv = 1; continue; } cur = stdin; consumed_stdin = 1; } else { cur = fopen(ac[i], "rb"); if (!cur) { perror(ac[i]); rv = 1; continue; } } process_one(cur); } return rv; } 
 tr -s '\r' '\n' <file | unix2dos 

编辑 (有人指出,上面完全忽略了这一点!•///•)

 tr -s '\r' '\n' <file | perl -pe 's/\s+$/\\r\\n/' 

tr删除空行和dos行尾。 管道意味着两个进程 – 在现代硬件上很好。

awk '{printf("%s\\r\\n",$0)} END {print ""}' file