regex 如果下一行不是以逗号开头,如何删除行与行之间的换行符?

jtjikinw  于 2022-11-26  发布在  其他
关注(0)|答案(6)|浏览(156)

我已经导出到一个文本文件我的所有文本消息,他们的格式是这样的。

, NAME +18001112222, RECV, Text message contents.
, NAME +18001112222, RECV, Text message contents that are run over to 
the line below it.
, NAME +18001112222, SENT, Text message contents that have

multiple lines and empty lines!
, NAME +18001112222, SENT, Text Message contents

我知道如何删除空行。如何使用awk、sed或grep将所有这些不以,开始的行移动到其上一行的末尾?
或者,您如何重新设置格式,以确保每条文本消息的所有内容都在一行上。
我还没有尝试过任何东西,因为我不确定从哪里开始,这就是为什么我在这里要求更多的实践手,希望提供一些实际的例子,如何去解决这个问题。提前感谢!

ybzsozfc

ybzsozfc1#

https://stackoverflow.com/a/73030681/10971581的想法相同:

awk -v ORS= '
    NR>1 && /^, / { print "\n" }
    1;
    END { print "\n" }
' inputfile

输入似乎是格式错误的CSV。通常会期望包含换行符或字段分隔符(,)的字段被引用。
请注意,通常不可能确定以,开头的行是连续的还是打算开始新的一行。上面的代码假定总是后者。

oymdgrw7

oymdgrw72#

我将利用GNU AWK来完成这个任务,如下所示,让file.txt内容

, NAME +18001112222, RECV, Text message contents.
, NAME +18001112222, RECV, Text message contents that are run over to 
the line below it.
, NAME +18001112222, SENT, Text message contents that have

multiple lines and empty lines!
, NAME +18001112222, SENT, Text Message contents

然后

awk 'BEGIN{RS="\n,"}{ORS=RT;gsub(/\n/," ");print}' file.txt

给出输出

, NAME +18001112222, RECV, Text message contents.
, NAME +18001112222, RECV, Text message contents that are run over to  the line below it.
, NAME +18001112222, SENT, Text message contents that have  multiple lines and empty lines!
, NAME +18001112222, SENT, Text Message contents

说明:我告诉GNU AWK行分隔符(RS)是换行符(\n)后跟逗号(,)然后为每一行设置输出行分隔符(ORS)是当前行终止符(RT)然后替换所有换行符(\n),然后I print行,行的后缀是行终止符。

  • (在GNU Awk 5.0.1中测试)*
vvppvyoh

vvppvyoh3#

使用GNU sed

$ sed -E ':a;/^,/{N;s/ *\n($|[a-z])/ \1/;ba}' input_file
, NAME +18001112222, RECV, Text message contents.
, NAME +18001112222, RECV, Text message contents that are run over to  the line below it.
, NAME +18001112222, SENT, Text message contents that have  multiple lines and empty lines!
, NAME +18001112222, SENT, Text Message contents
omhiaaxx

omhiaaxx4#

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

sed ':a;N;/\n$\|\n[^,]/s/\n//;ta;P;D' file

追加下一行,如果它是空的或者不是以,开始,则删除换行符并重新执行。否则,打印/删除第一行并重新执行。
注意:当模式空间不为空时,即,从之前剩余填充时,D命令禁止用下一行自动补充模式空间。

2uluyalo

2uluyalo5#

带有-z选项的GNU sed

sed -rz ':a;s/\n([^,])/\1/g;ta' inputfile
igetnqfo

igetnqfo6#

您可以使用Perl One-Liner(RexEgg解释)。

perl -0777 -pe 's/\n+(?!,)/ /g;' yourfile

Here is a demo at regex101或www.example.com上的bash演示tio.run
这会将one or more\n * 换行符 * 替换为空格if not followed by和逗号。
要防止删除字符串末尾的换行符,请修改 lookahead(?!$|,)

相关问题