如何连接匹配模式的行?
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,他没有说他希望每行放置一个句子,即使这是他想要的,寻找“.
”也是一种识别句子的糟糕方式。跨度>
以上是关于如何连接匹配模式的行?的主要内容,如果未能解决你的问题,请参考以下文章