linux命令替换换行发生在字符串中间

问题描述 投票:0回答:1

当前文件:

COl1,COl2,COl3,COl4,COL5
AAA1,AAA1,AAA1,AAA1,AAA1
BBB10,BB11
,BB22,BB33
BB44
CCCC,CCC1,CCC2,CCC3
,CCC4,CCC5

预期:

COl1,COl2,COl3,COl4,COL5
AAA1,AAA1,AAA1,AAA1,AAA1
BBB10,BB11,BB22,BB33,BB44
CCCC,CCC1,CCC2,CCC3

寻找东西

  1. 检查换行符和以逗号开头的下一行,然后删除换行符
  2. 检查换行符和下一行是否以模式开头,然后删除下一个换行符。

最好使用 sed。 源在字符串之间有不需要的换行符,并且字符串边界没有双引号。

尝试了以下方法,但没有成功:

sed -z -i 's/\n,*/.../g'  filename
sed scripting
1个回答
0
投票

这可能对你有用(GNU sed):

sed -E ':a;N;s/\n,/,/;ta;s/\n([^,]+)$/,\1/;ta;P;D' file 

打开扩展正则表达式

-E

创建循环占位符

:a

追加下一行

N
(换行符将添加到下一行之前)。

用逗号替换换行符和逗号。

如果最后一次替换成功,则跳回循环占位符。

如果上次替换不成功,请将后跟非逗号字符串的换行符替换为逗号后跟该字符串。

如果最后一次替换成功,则跳回循环占位符。

在所有情况下,打印模式空间中的第一行,然后删除模式空间中的第一行。

注意在

D
命令之后,如果模式空间不为空,则不会将下一行隐式放置在模式空间中,并且 sed 循环再次开始。

© www.soinside.com 2019 - 2024. All rights reserved.