我有类似的文件
AAA
BBB
CCC
我需要他们sed进入aaa\r\nbbb\r\nccc
它应该适用于unix和Windows,相应地用\r
或\r\n
replace它们
问题是sed
在行尾添加了\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