Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows sed:如何用“替换CR和/或LF”\r"&引用\n‘;,因此,任何文件都将在一行中_Windows_Macos_Unix_Sed - Fatal编程技术网

Windows sed:如何用“替换CR和/或LF”\r"&引用\n‘;,因此,任何文件都将在一行中

Windows sed:如何用“替换CR和/或LF”\r"&引用\n‘;,因此,任何文件都将在一行中,windows,macos,unix,sed,Windows,Macos,Unix,Sed,我有像这样的文件 aaa bbb ccc 我需要将它们转换为aaa\r\nbbb\r\nccc 它应该适用于unix和windows,并相应地用\r或\r\n替换它们 问题是,sed在行尾添加了\n,但保持了行之间的分隔。如何修复它?可以在SED中合并行,但我个人认为需要更改断线,表示放弃SED的时间,而使用更强大的语言。您需要的是一行perl: perl -e 'undef $/; while (<>) { s/\n/\\n/g; s/\r/\\r/g; print $_, "\n

我有像这样的文件

aaa

bbb

ccc

我需要将它们转换为
aaa\r\nbbb\r\nccc

它应该适用于unix和windows,并相应地用
\r
\r\n
替换它们


问题是,
sed
在行尾添加了
\n
,但保持了行之间的分隔。如何修复它?

可以在SED中合并行,但我个人认为需要更改断线,表示放弃SED的时间,而使用更强大的语言。您需要的是一行perl:

perl -e 'undef $/; while (<>) { s/\n/\\n/g; s/\r/\\r/g; print $_, "\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;
 }
#包括
作废进程(文件*fp)
{
INTC;
而((c=getc(fp))!=EOF)
如果(c=='\n')fputs(“\\n”,标准输出);
如果(c=='\r')fputs(\\r),stdout);
else putchar(c);
fclose(fp);
putchar('\n');
}
int main(int argc,字符**argv)
{
文件*cur;
int i,消耗的标准偏差=0,rv=0;
如果(argc==1)/*没有参数*/
{
过程1(标准DIN);
返回0;
}
对于(i=1;i

可以在SED中合并行,但我个人认为需要更改断线,表示放弃SED的时间,而使用更强大的语言。您需要的是一行perl:

perl -e 'undef $/; while (<>) { s/\n/\\n/g; s/\r/\\r/g; print $_, "\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;
 }
#包括
作废进程(文件*fp)
{
INTC;
而((c=getc(fp))!=EOF)
如果(c=='\n')fputs(“\\n”,标准输出);
如果(c=='\r')fputs(\\r),stdout);
else putchar(c);
fclose(fp);
putchar('\n');
}
int main(int argc,字符**argv)
{
文件*cur;
int i,消耗的标准偏差=0,rv=0;
如果(argc==1)/*没有参数*/
{
过程1(标准DIN);
返回0;
}
对于(i=1;i
这两个命令结合在一起可以实现您想要的功能:

sed ':a;N;$!ba;s/\r/\\r/g'
sed ':a;N;$!ba;s/\n/\\n/g'
将输入文件同时传递给这两个文件,以获得所需的输出。可能有一种方法可以将它们组合成一个表达式

从该问题中窃取和修改:


这两个命令结合在一起可以实现您想要的功能:

sed ':a;N;$!ba;s/\r/\\r/g'
sed ':a;N;$!ba;s/\n/\\n/g'
将输入文件同时传递给这两个文件,以获得所需的输出。可能有一种方法可以将它们组合成一个表达式

从该问题中窃取和修改:


tr-s'\r'\n'
tr-s'\r'\n'
awk'{printf(%s\\r\\n',$0)}结束{print'}文件
awk'{printf(%s\\r\\n',$0)}结束{print'}文件
哦,太可爱了。只需在另一个程序的末尾添加一个
s
命令即可将其组合在一起,如:
sed:a;N、 美元!文学士;s/\n/\\n/g;s/\r/\\r/g'
我试图想出一个
:a;N、 美元!ba
序列,但无法正确执行。谢谢,但我仍收到多行。我在mac os x上运行它。。。。如果你在OSX上,为什么要给它贴上“linux”的标签?哦,太可爱了。只需在另一个程序的末尾添加一个
s
命令即可将其组合在一起,如:
sed:a;N、 美元!文学士;s/\n/\\n/g;s/\r/\\r/g'
我试图想出一个
:a;N、 美元!ba
序列,但无法正确执行。谢谢,但我仍收到多行。我在mac os x上运行它。。。。如果你在OSX上,为什么要给它贴上“linux”的标签?谢谢,但是我可以不用perl吗?如果bdk的建议对你不起作用,我不知道还有比使用perl更好的方法。(或者C。这大约是20行C。)OSX附带了perl,所以我不知道问题出在哪里?谢谢,但是我可以不用perl吗?如果bdk的建议对您不起作用,我不知道还有比使用perl更好的方法。(或者C。这大约需要20行C。)OSX附带了perl,所以我看不出问题出在哪里?这与OP的要求不符。请参见我和bdk的答案。OP想要将LF和CR字符转换为C样式的转义序列,结果是文件中根本没有换行符。@Zack:Doh!我必须学会阅读这些问题。我会加上必要的。TVM。这不符合OP的要求。请参阅我和bdk的答案。OP想要将LF和CR字符转换为C样式的转义序列,结果是文件中根本没有换行符。@Zack:Doh!我必须学会阅读这些问题。我会加上必要的。TVM。