command-line - 使用 sed 或 awk 从标签搜索模式并将其插入到下一行

标签 command-line awk sed

我有几个需要修改的文本文件。 它们看起来像:

Tag: Brown
Chair
Pencil
Tag: Red
Apple
Shirt
Pant
         # <--- some files have one or more (about less than five) blank line(s)
Tag: Black
Wall

我想通过将“Tag:”之后的单词作为变量来格式化它,插入到下一行,直到遇到其他“Tag:”。 “Tag:”之间的行可能会有所不同。所以这里的输出格式示例:

Brown Chair and Chairs
Brown Pencil and Pencils
Red Apple and Apples
Red Shirt and Shirts
Red Pant and Pants
         # <--- blank line(s) retain BLANK(s)
Black Wall and Walls

当我查看并修改 http://sed.sourceforge.net/ 处的一些示例时但仍然没有成功。

sed ':loop; $!N; /^Tag:/h; n; /^Tag:/!b next; t loop; :next; x; p; x'

谢谢。

**更新**

根据 @jaypal 的建议并“仔细”查看每个文本文件,我添加了“空行”场景。

最佳答案

我对 sed 的尝试(没有循环、分支或反向引用,我喜欢简单的事情):

sed '/Tag:/{s/Tag: //;h;d;};G;s/\(.*\)\n\(.*\)/\2 \1 and \1s/'

编辑:

保留空行:

sed '/Tag:/{s/Tag: //;h;d;};/./{G;s/\(.*\)\n\(.*\)/\2 \1 and \1s/;}'

关于command-line - 使用 sed 或 awk 从标签搜索模式并将其插入到下一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26004713/

相关文章:

java - 如何在 Java 中向 telnet/AS400 主机发送多行信息并以结构化格式读取结果屏幕

linux - 使用列名称而不是数字来过滤条件

linux - 在 unix/linux 中按数字排序,其中 "sort -V"不可用

linux - 使用 sed 删除 _ 和 - 字符

linux - 在 Linux 中修改(为每个字节添加一个数字)二进制文件的好方法是什么?

php - 替换 $_GET 以使其从命令行工作

linux - su -c 从引号内的命令获取参数

regex - 查找给定字符串后的第一个字符

linux - 使用 awk 尾部文件并执行一组命令

sed - 替换 !使用 sed 导致找不到事件