如何在Unix中字符串中间的可变长度文件中替换CRLF字符?

时间:2018-08-14 15:34:10

标签: unix

我的样本文件是可变长度的,没有任何字段定界符。行的最小长度为18个字符,并且第11至15列之间可能(并非总是)存在“ CRLF”。仅当中间有换行符('CRLF')(第11-15列)时,才如何用空格替换。我仍然想保留真实的记录。 样本数据:

输入:

1123xxsdfdsfsfdsfdssa
1234ddfxxyff
frrrdds
1123dfdffdfdxxxxxxxxxas
1234ydfyyyzm
knsaaass
1234asdafxxfrrrfrrrsaa
1123werwetrretttrretertre

预期输出:

1123xxsdfdsfsfdsfdssa
1234ddfxxyfff rrrdds
1123dfdffdfdxxxxxxxxxas
1234ydfyyyzm knsaaass
1234asdafxxfrrrfrrrsaa
1123werwetrretttrretertre

我尝试过的事情:

sed '/^.\{15\}$/!N;s/./ /11' filename

但是上面的代码只是增加空间,而不是删除'CRLF'

1 个答案:

答案 0 :(得分:0)

给出您的样本数据,这似乎会产生所需的输出:

$ awk 'length($0) < 18 { getline x; $0 = $0 " " x} { print }' data
1123xxsdfdsfsfdsfdssa
1234ddfxxyff frrrdds
1123dfdffdfdxxxxxxxxxas
1234ydfyyyzm knsaaass
1234asdafxxfrrrfrrrsaa
1123werwetrretttrretertre
$

但是,如果输入包含CRLF行结尾,事情就不会那么高兴;最好一并过滤掉CR字符(Unix文件通常不包含CR,当然也通常不包含CRLF行尾)。

$ tr -d '\r' < data | awk 'length($0) < 18 { getline x; $0 = $0 " " x} { print }'
1123xxsdfdsfsfdsfdssa
1234ddfxxyff frrrdds
1123dfdffdfdxxxxxxxxxas
1234ydfyyyzm knsaaass
1234asdafxxfrrrfrrrsaa
1123werwetrretttrretertre
$

如果您确实需要DOS风格的CRLF输入和输出,则可能需要使用utodunix2dos之类的程序(或其他类似工具)将Unix行尾转换为DOS。