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$
如果文件不控制 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$