AIX(无GNU sed/awk)连接行,如果它的末尾没有控件M或\r字符

AIX(无GNU sed/awk)连接行,如果它的末尾没有控件M或\r字符,awk,sed,aix,Awk,Sed,Aix,我正在寻找一种方法来连接线,如果文件不控制M字符。AIX有其标准的awk和sed实用程序,但没有GNU 问题是:我们从第三方windows获取文件。并且文件在每行末尾都有^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

我正在寻找一种方法来连接线,如果文件不控制M字符。AIX有其标准的awk和sed实用程序,但没有GNU

问题是:我们从第三方windows获取文件。并且文件在每行末尾都有^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”键来使用文本回车符

以下
sed(1)
script在不以回车结束的行上循环,删除不需要的换行符:

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

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

通过键入
^V
(Ctrl-V)并后跟“return”键,可以使用文本回车

以下
sed(1)
script在不以回车结束的行上循环,删除不需要的换行符:

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/\0/g;s/\n//g;s/\0/\r\n/g" |cat -vte
abc^M$
defijk^M$
lmn^M$

请注意,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$


b
4
之间是否有
\n
?如果您不确定,请运行
cat-vet yourFile
yes,在“b”之后我看到“$”符号,即出现此问题的行。
unix2dos
将处理此问题。显然,带有控件m的行有\r和\n,对吗?
cat-vet
不会向我提供好的信息。将带有控制装置M的管线输送至
| od-t x1c
,以将管线剥离至ascii十六进制<代码>\r将显示为
0d
\n
将显示为
0a
。在
b
4
之间是否存在
\n
?如果您不确定,请运行
cat-vet yourFile
yes,在“b”之后我看到“$”符号,即出现此问题的行。
unix2dos
将处理此问题。显然,带有控件m的行有\r和\n,对吗?
cat-vet
不会向我提供好的信息。将带有控制装置M的管线输送至
| od-t x1c
,以将管线剥离至ascii十六进制<代码>\r将显示为
0d
,而
\n
将显示为
0a
。您是否在BSD/非GNU Sed中测试过这一点??我认为它不起作用。BSD sed不直接允许替换操作中的
\n
s/
@geogevasiliou是的,并且
\n
在中,而不是替换中。非常感谢KDHP,该解决方案对我有效。我还可以以某种方式使用\r而不是^M,其他方式。我想使用一行解决方案作为shell脚本的一部分,该脚本通过ssh连接到此服务器并连接。我在服务器上没有太多权限,甚至没有创建文件的权限。我认为以下内容似乎有效,@kdhp或任何sed专家,请查看:sed-e':l'-e'/'$(echo“\015”)'$/!{N;s/\N/;bl'-e'}sample.txt您在BSD/非GNU环境中测试过这个吗??我认为它不起作用。BSD sed不直接允许替换操作中的
\n
s/
@geogevasiliou是的,并且
\n
在中,而不是替换中。非常感谢KDHP,该解决方案对我有效。我还可以以某种方式使用\r而不是^M,其他方式。我想使用一行解决方案作为shell脚本的一部分,该脚本通过ssh连接到此服务器并连接。我在服务器上没有太多权限,甚至没有创建文件的权限。我认为以下内容似乎有效,@kdhp或任何sed专家,请查看:sed-e':l'-e'/'$(echo“\015”)'$/!{N;s/\N/;bl'-e'}'sample.txt