AIX(无 GNU sed/awk)如果末尾没有控制 M 或 \r 字符则加入行

AIX (no GNU sed/awk) join line if it does NOT have control M or \r character at the end

如果文件不控制 M 字符,我正在寻找加入行的方法。 AIX 有其标准的 awk 和 sed 实用程序但 GNU

问题:我们从 windows 的第 3 方获取文件。并且该文件在每一行的末尾都有 ^M(即 \r)字符,除了某些行,其中某些字段中的数据本身具有 \n 字符。因此需要加入具有这个额外 \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

提前感谢您的帮助。

可以通过键入 ^V (Ctrl-V) 后跟 "Return" 键来使用文字回车-return。

以下 sed(1) 脚本在不以回车符结尾的行上循环 -return,删除不需要的换行符:

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

作为一行:

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

郑重声明,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/[=10=]/g;s/\n//g;s/[=10=]/\r\n/g" |cat -vte
abc^M$
defijk^M$
lmn^M$