如何连接匹配模式的行?

Posted

技术标签:

【中文标题】如何连接匹配模式的行?【英文标题】:How to concatenate lines that match a pattern? 【发布时间】:2022-01-13 20:48:53 【问题描述】:

我有一个很大的文件,其中大多数行都很长,但有几行只是几个词:

这是一个很长的句子。 这 是 一种 短的 线。 这是一个很长的句子。 这是一个很长的句子。 这 是 其他 短的 线。 这是一个很长的句子。

所有短行都以独特的单词开头。在此示例中,短行以“This”开头并以“line”结尾。它们跨越的行数完全相同。我需要一个命令来连接 only 文件中的短行,以便我得到

这是一个很长的句子。 这是一条短线。 这是一个很长的句子。 这是一个很长的句子。 这是另一条短线。 这是一个很长的句子。

是否有一个命令可以完成这项工作?如果不用的话,我不想写脚本程序……

谢谢。

【问题讨论】:

“长”行绝对不能以“This”开头吗? 当您说All short lines begin with unique words. 时,您的意思是All short lines begin with a single word.?您需要发布一些更具代表性的输入和预期输出。 请试试这个模块to split English sentences 抱歉没有明确说明问题。 (我试图简洁)。我的意思是我要连接的所有行集都以相同的关键字(例如“This”)开头,并且跨越相同数量的行。而我不想连接的行,这些行不以该关键字开头。换句话说,每次我遇到“这个”这个词时,我都想将该行与接下来的 4 行连接起来。 【参考方案1】:
sed -e :a -e '/line\.$/p;d;' -e '/^This/N;s/\n/ /g;;ta' file.in > file.out

【讨论】:

【参考方案2】:
perl -pe's/\n/ / if ($j ||= /^This$/) &&= !/^line\.$/'

用法:

perl -pe'...' file.in >file.out    # From file
perl -pe'...' <file.in >file.out   # From STDIN
perl -i~ -pe'...' file             # "In-place" with backup
perl -i -pe'...' file              # "In-place" without backup

【讨论】:

如果所有句子都以句点结尾,为什么要使用“This”和“line”?你能用一个空格替换所有 CR/LF,然后替换 '\.'与'\。\ n'?这假设我们希望每行一个句子。 @Jim Black,因为我选择遵循规范而不是做出毫无根据的假设。 迟到了,'在这个例子中,......'。 @Jim Black,如果您对我的解决方案有疑问,因为识别因素说明不够清楚,请想象一下您建议使用根本没有提及的识别因素意味着什么! @Jim Black,他没有说他希望每行放置一个句子,即使这是他想要的,寻找“.”也是一种识别句子的糟糕方式。跨度>

以上是关于如何连接匹配模式的行?的主要内容,如果未能解决你的问题,请参考以下文章

我如何 git 只添加与模式匹配的行?

如何从 Fortran 模式匹配的行开始读取数据?

Pandas - 查找和索引与行序列模式匹配的行

在 Unix 提示符下,如何从与模式匹配的文件中提取可变数量的行(可能包括空行)?

csv 文件中的模式匹配并附加到匹配的行

如果一行匹配条件,则 sed 替换与模式范围匹配的行