我想解析一个文件,其中包含一些名称 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/