linux - 使用 linux 从文本文件中有选择地解析注释和值

标签 linux parsing shell

我想解析一个文件,其中包含一些名称 block 顶部的名称和注释。如果我有这样的文件:

Art
Boat
Road
Tree
Street

# Blah
Star
Car
Sun

Sock

# Comm1
# Comm2
Stop
Stick
# Comm
Stock
Dock

我想以某种方式解析此文件,以便提取所有以“S”开头的名称及其相应的注释。相应的注释是紧接其前的注释 block (一行或多行注释),直到在其前面遇到空格。一个注释 block 也适用于它后面的所有条目,直到遇到空格或另一个注释 block 。所以上面输入的输出应该是这样的:

**Name      Comments**

Street
Star        # Blah
Sun         # Blah
Sock
Stop        # Comm1 # Comm2
Stick       # Comm1 # Comm2
Stock       # Comm

谁能建议一个好的方法来做这件事(最好使用 shell)?真的很感激。谢谢!

PS:如果我的描述不清楚,我深表歉意,这还是新手。

最佳答案

假设您的空白行不包含空格:

sed -n '/^#/H; /^S/{G; y/\n/ /; p}; /^$/h' input

第一个命令 (/^#/H) 将当前行(注释)附加到保留空间。 下一个命令将保留空间(包含所有累积的注释)附加到当前缓冲区,用一个空格替换所有换行符,然后打印该行。每当遇到空行时,最终命令都会清除保留空间。

编辑(感谢 blahdiblah)

当检测到一个没有前面空行的新评论 block 时,上面的代码不会正确地重置累加器。这很丑陋,但可以说明这一点:

sed -n '/^#/{h; bk}; :j /^S/{G; y/\n/ /; p}; /^$/h; d; :k n; /^#/{ H; bk}; bj;' input

关于linux - 使用 linux 从文本文件中有选择地解析注释和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11751110/

相关文章:

java - 如何使用 Jsoup 从 <p> 获取文本

C 用已知的最大长度逐个字符构建字符串

linux - 为什么 shell_exec 执行超过 1 个进程?

shell - 如何恢复这个 1mb 的 sql 转储?

linux - 确定 HTTPS apache 连接使用的密码强度

c - utf-8 字符串的最佳哈希是什么

python - 如何加快读取多个文件并将数据放入数据框中?

Linux shell 脚本

linux - 通过 crontab 终止后运行 python 程序

带引号的 Linux bash 命令 - 引号内 - 引号内