是否可以处理与模式匹配的文本行并将其移动到与另一个模式匹配的另一个位置(在同一文件中)? [关闭]

Posted

技术标签:

【中文标题】是否可以处理与模式匹配的文本行并将其移动到与另一个模式匹配的另一个位置(在同一文件中)? [关闭]【英文标题】:Is it possible to process and move lines of text matching a pattern to another location matching another pattern (in the same file)? [closed] 【发布时间】:2021-08-28 05:29:43 【问题描述】:

我需要处理和移动文件中的一些文本块(实际上是流)。

这个过程并不简单,但在概念上很简单,所以我想知道通过文本处理工具执行它的最简单方法是什么。

示例输入如下;破折号是不相关的文本:

---
---
FOO 1,
FOO 2
---
---
BAR 0 --
---
---

应该变成:

---
---
---
---
-- BAR 0 BAZ FOO 1,
BAZ FOO 2
--
---
---

目标中的空格(类型)无关紧要,只要有一些间距,所以,如果它更简单,这样的目标行也可以:

-- BAR 0 BAZ FOO 1, BAZ FOO 2--

可能,sed 的保持缓冲区或 Perl 变量可以,但我不知道它们足够好,无法提取一些简单的东西(如果可能的话)。

【问题讨论】:

从您的示例中非常不清楚您提取和重新排列文本的标准是什么。 我们甚至无法从该示例中判断您是尝试单独替换 FOO 1 和 FOO 2 还是仅当它们作为一对连续行出现时。在进行文本匹配时,由破折号表示的文本永远不会无关紧要 - 你应该用一些真正有代表性的文本替换它。 【参考方案1】:

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

sed '/FOO/H;//d;/BAR/!b;x;s/\n/ BAZ /g;H;z;x;s/\n//g;s/, /,\n/g;s/-- //g;s/.*/-- &\n--/' file

FOO 行复制到保留空间中,并在找到BAR 行时将它们附加并操作为所需的格式。

替代格式:

sed '/FOO/H;//d;/BAR/!b;x;s/\n/ BAZ /g;H;z;x;s/ --\n//;s/.*/-- & --/' file

注意这是破坏性的,取决于BAR 跟随FOO。如果这是无条件的,则需要另一种方法,可能使用/FOO/:a;N;/^BAR/M!ba;....' file 成语。

【讨论】:

以上是关于是否可以处理与模式匹配的文本行并将其移动到与另一个模式匹配的另一个位置(在同一文件中)? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

linux基础之grep

拆分类并将它们与另一个 DIV 匹配。 jQuery

grepsedawk基础

文本检索

grep命令及正则

Vim global命令和重复操作