如何更改sed认为的行分隔符

时间:2011-08-02 23:32:53

标签: sed

由于我是sed的新手,我很高兴看到sed并不认为\ r \ n字符是有效的行分隔符。

有没有人知道如何告诉sed在处理多行文字时,我希望将哪个字符用作行分隔符?

3 个答案:

答案 0 :(得分:1)

您可以使用awk的RS(记录分隔符)变量指定它:awk 'BEGIN {RS = "\r"} ...

或者您可以转换为:tr '\r' '\n'

答案 1 :(得分:1)

(为了使下面的例子更清晰,更不明确,我将广泛使用the od util。)

例如,不可能使用标志。我敢打赌,最好的解决方案是前面答案所引用的解决方案:使用tr。如果你有一个如下文件:

$ od -xc slashr.txt
0000000      6261    0d63    6564    0d66                                
           a   b   c  \r   d   e   f  \r                                
0000010

使用tr有多种方式;我们想要的是为它传递两个参数 - 两个不同的字符 - 而tr将用第二个参数替换第一个参数。将文件内容作为tr '\r' '\n'的输入发送,我们得到以下结果:

$ tr '\r' '\n' < slashr.txt | od -xc 
0000000      6261    0a63    6564    0a66                                
           a   b   c  \n   d   e   f  \n                                
0000010

大!现在我们可以使用sed

$ tr '\r' '\n' < slashr.txt | sed 's/^./#/'
#bc
#ef
$ tr '\r' '\n' < slashr.txt | sed 's/^./#/' | od -xc
0000000      6223    0a63    6523    0a66                                
           #   b   c  \n   #   e   f  \n                                
0000010

但我认为你需要使用\r作为行分隔符,对吧?在这种情况下,只需使用tr '\n' '\r'来反转转化:

$ tr '\r' '\n' < slashr.txt | sed 's/^./#/' | tr '\n' '\r' | od -xc
0000000      6223    0d63    6523    0d66                                
           #   b   c  \r   #   e   f  \r                                
0000010

答案 2 :(得分:0)

据我所知,你不能。使用换行符作为分隔符有什么问题?如果您的输入具有DOS样式的\ r \ n行结尾,则可以对其进行预处理以删除它们,如有必要,可以在之后返回它们。