如何在UNIX中从一个字符串中间的可变长度文件替换CRLF CHAR?
我的示例文件是可变长度的,没有任何字段分隔符。行的长度至少为18个字符,“CRLF”可能(并非总是)在第11-15列之间。如何在中间有一个新的行字符(“CRLF”)时,用一个空格替换它(列11-15)。我仍然想保持真实的记录。 样本数据: 输入:如何在UNIX中从一个字符串中间的可变长度文件替换CRLF CHAR?,unix,Unix,我的示例文件是可变长度的,没有任何字段分隔符。行的长度至少为18个字符,“CRLF”可能(并非总是)在第11-15列之间。如何在中间有一个新的行字符(“CRLF”)时,用一个空格替换它(列11-15)。我仍然想保持真实的记录。 样本数据: 输入: 1123xxsdfdsfsfdsfdssa 1234ddfxxyff frrrdds 1123dfdffdfdxxxxxxxxxas 1234ydfyyyzm knsaaass 1234asdafxxfrrrfrrrsaa 1123werwetrret
1123xxsdfdsfsfdsfdssa
1234ddfxxyff
frrrdds
1123dfdffdfdxxxxxxxxxas
1234ydfyyyzm
knsaaass
1234asdafxxfrrrfrrrsaa
1123werwetrretttrretertre
预期产出:
1123xxsdfdsfsfdsfdssa
1234ddfxxyfff rrrdds
1123dfdffdfdxxxxxxxxxas
1234ydfyyyzm knsaaass
1234asdafxxfrrrfrrrsaa
1123werwetrretttrretertre
$ awk 'length($0) < 18 { getline x; $0 = $0 " " x} { print }' data
1123xxsdfdsfsfdsfdssa
1234ddfxxyff frrrdds
1123dfdffdfdxxxxxxxxxas
1234ydfyyyzm knsaaass
1234asdafxxfrrrfrrrsaa
1123werwetrretttrretertre
$
我尝试的是:
sed '/^.\{15\}$/!N;s/./ /11' filename
但是上面的代码只是添加了空间,没有删除“CRLF”给定您的示例数据,这似乎产生了所需的输出:
1123xxsdfdsfsfdsfdssa
1234ddfxxyfff rrrdds
1123dfdffdfdxxxxxxxxxas
1234ydfyyyzm knsaaass
1234asdafxxfrrrfrrrsaa
1123werwetrretttrretertre
$ awk 'length($0) < 18 { getline x; $0 = $0 " " x} { print }' data
1123xxsdfdsfsfdsfdssa
1234ddfxxyff frrrdds
1123dfdffdfdxxxxxxxxxas
1234ydfyyyzm knsaaass
1234asdafxxfrrrfrrrsaa
1123werwetrretttrretertre
$
$awk'长度($0)<18{getline x;$0=$0“x}{print}数据
1123xxSDSDSFDSSA
1234ddfxxyff frrrdds
1123DFDFFDFDXxxxxxxxas
1234ydfyyyzm KNSAAS
1234ASDAFXXFRRRSA
1123Werwetrettrretre
$
然而,如果输入包含CRLF行结尾,事情就不会那么愉快了;最好完全过滤掉CR字符(Unix文件通常不包含CR,当然也不具有CRLF行结尾)
$tr-d'\r'
如果您确实需要DOS风格的CRLF输入和输出,您可能需要使用诸如
utod
或unix2dos
(或其他类似工具)之类的程序从Unix行结尾转换为DOS。显示您迄今为止的尝试。安德鲁:用预期的输出编辑了问题,并添加了我尝试过的内容。非常感谢。文件中的所有行是否都有CRLF行结尾?或者CRLF是否仅在分割线时出现;否则,行是否有NL(LF)结尾?