sed: как заменить CR и / или LF на "\ r", \ n ", чтобы любой файл был в одной строке - PullRequest
0 голосов
/ 24 марта 2011

У меня есть файлы типа

ааа

ГЭБ

ссс

Мне нужно, чтобы они успели в aaa\r\nbbb\r\nccc

Должно работать как для Unix, так и для Windows, заменяя их \r или \r\n соответственно

Проблема в том, что sed добавляет \n в конце строки, но сохраняет строки разделенными. Как я могу это исправить?

Ответы [ 4 ]

2 голосов
/ 24 марта 2011

Эти две команды вместе должны делать то, что вы хотите:

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

Пропустить ваш входной файл через обе, чтобы получить желаемый результат.Вероятно, есть способ объединить их в одно выражение.

Украдено и изменено из этого вопроса:

Как заменить символ новой строки (\ n) с помощью sed?

1 голос
/ 24 марта 2011
tr -s '\r' '\n' <file | unix2dos

РЕДАКТИРОВАТЬ (отмечалось, что вышеупомянутое полностью не соответствует пункту! • /// •)

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

tr избавляет от пустых строк и окончаний строк. Труба означает два процесса - хорошо на современном оборудовании.

1 голос
/ 24 марта 2011

Возможно объединить строки в 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;
 }
0 голосов
/ 24 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...