2017-03-01 20 views
0

如果文件不控制M字符,我正在寻找连接线的方式。 AIX有它的标准awk和sed工具,但不是GNUAIX(没有GNU sed/awk)连接线如果在末尾没有控制M或 r字符

问题:我们从第三方获取文件,从Windows。并且该文件在每行的结尾处具有^ M(即\ r)字符,期望某些行中的某些行中的数据本身具有\ n字符。因此,需要加入具有这个额外字符的行。

数据例如:

col1|col2|col3|col4|col5|^M 
a1|a2|a3|a4|a5|^M 
b1|b2|b3|b 
4|b5|^M 
c1|c2|c3|c4|c5|^M 

预期的输出。

col1|col2|col3|col4|col5|^M 
a1|a2|a3|a4|a5|^M 
b1|b2|b3|b4|b5|^M 
c1|c2|c3|c4|c5|^M 

非常感谢您的帮助。

+0

是否有一个'\了'B'和'4'之间N'?如果您不确定,请运行'cat -vet yourFile' –

+0

是的,我在“b”之后看到“$”符号,即对于有此问题的线路。 – MeRicI

+0

'unix2dos'将处理该问题。 – karakfa

回答

2

只是为了记录,perl处理\ n,\ r等非常好的转换,没有非gnu sed的限制 - 实际上perl -pe可以直接替换sed。

所以这个操作在BSD运行良好:

$ echo -ne "abc\r\ndef\nijk\r\nlmn\r\n" |cat -vte 
abc^M$ 
def$ 
ijk^M$ 
lmn^M$ 

$ echo -ne "abc\r\ndef\nijk\r\nlmn\r\n" |perl -pe "s/\r\n/\0/g;s/\n//g;s/\0/\r\n/g" |cat -vte 
abc^M$ 
defijk^M$ 
lmn^M$ 
+0

是的,这也工作。谢谢George Vasiliou – MeRicI

0

通过输入^V(Ctrl-V),然后按“返回”键,可以使用文字回车符。

以下sed(1)脚本遍历不以回车结尾的行,删除不需要的行提要:

sed ' 
:label 
/^M$/! { 
    N 
    s/\n// 
    blabel 
}' 

为一条线:

sed -e ':l' -e '/^M$/!{N;s/\n//;bl' -e '}' 
+0

你有没有在BSD/non GNU Sed中测试这个?我认为这是行不通的。 BSD sed不直接允许'\ n'替换操作''/ –

+0

@GeorgeVasiliou是的,而'\ n'在[regular-expression]中(http://pubs.opengroup.org/onlinepubs /9699919799/utilities/sed.html#tag_20_116_13_02),而不是替代。 – kdhp

+0

非常感谢KDHP,该解决方案为我工作。 – MeRicI

相关问题