标题应该是:Remove all lines between two similar patterns, including the line of the starting pattern. if another specific pattern in between is not matched
。我把它写得更短,因为它对于其他在谷歌上搜索答案的人来说更容易阅读。
关于问题:我有一个特定计算机的可上市股票和不可上市股票的列表。我想创建一个包含可列出共享的所有计算机的列表,并删除其不可读的共享。但我遇到了两个问题。首先,正确删除两个相似图案之间的所有线条。其次,如果发现特定模式,如何不删除两个相似单词之间的行。
我的输入是
Shares for DED-SHD-ED-5:
[--- Unreadable Shares ---]
ADMIN$
C$
E$
H$
IPC$
Shares for DED-SHD-ED-6:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
[--- Listable Shares ---]
print$
Shares for DED-SHD-ED-7:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
[--- Listable Shares ---]
backup backup2
Shares for DED-SHD-ED-8:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
Shares for DED-SHD-ED-9:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
VBRCatalog
[--- Listable Shares ---]
backup backup2
我设法使用以下命令删除所有不可读的共享awk '/Listable Shares/,/Shares for/' input.txt
,该命令的问题是DED-SHD-ED-8
没有Listable Shares
。它会剥离下面的计算机,我将看到atDED-SHD-ED-9
的可上市股票DED-SHD-ED-9
DED-SHD-ED-8
请参阅下面的输出(我知道列表中第一台计算机的名称丢失,但这对我来说不是问题)
[--- Listable Shares ---]
print$
Shares for DED-SHD-ED-7:
[--- Listable Shares ---]
backup backup2
Shares for DED-SHD-ED-8:
[--- Listable Shares ---]
backup backup2
为了解决这个问题,我的想法是在运行之前剥离所有没有可列表共享的计算机awk '/Listable Shares/,/Shares for/' input.txt
。起初,我尝试删除“Shares for”和“Shares for”之间的所有行。我在论坛上环顾四周,试图做出更简单的答案,并避免使用复杂的答案,因为它们目前超出了我的理解范围。例如,我使用了这个命令sed '/^Shares for/,/^Shares for/{//!d;};' input.txt
,sed '/Shares for/,/:/{//!d;};' input2.txt
在这里它删除了计算机之间的一半线路。
输出
Shares for DED-SHD-ED-5:
Shares for DED-SHD-ED-6:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
[--- Listable Shares ---]
print$
Shares for DED-SHD-ED-7:
Shares for DED-SHD-ED-8:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
为什么它只删除一半计算机的数据?我不明白为什么
我的下一个想法是在命令中添加一个排除,如果模式Listable
在这些行中匹配,则不删除“Shares for”和“Shares for”之间的行。然后删除没有数据的计算机,如DED-SHD-ED-5
和DED-SHD-ED-7
。但也许这不是最好的方法。也许最好删除第一个模式的行,因为看不到模式“Listable”。
我希望得到一些帮助和见解,如何正确处理这一切。
预期输出:
Shares for DED-SHD-ED-6:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
[--- Listable Shares ---]
print$
Shares for DED-SHD-ED-7:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
[--- Listable Shares ---]
backup backup2
Shares for DED-SHD-ED-9:
[--- Unreadable Shares ---]
ADMIN$
C$
IPC$
VBRCatalog
[--- Listable Shares ---]
backup backup2
理解:
Shares
如果该块包含字符串,则打印该块Listable Shares
一旦您加入
awk
其中,通常就可以消除对sed
.一个(详细的)
awk
想法:进行试驾:
这对你有用吗?
shares
是我为您的示例输入选择的文件名。如果还没有换行符,基本上
sed
会在之前插入换行符Shares
- 这样我们就可以使用换行符RS="\n\n"
作为awk
. 那么问题就很简单了:只打印包含该词的记录Listable
。使用Raku(以前称为 Perl_6)
Raku 是 Perl 家族的一种编程语言。在一个可能被认为是正
split
则表达式模式上破坏性设置的相反操作中,Raku 提供了comb
允许您选择您选择的元素的例程。.comb(/^^Shares .*? <?before ^^Shares | $ >/)
上面,通过选择具有以下内容的记录将输入文件分为多个记录:^^Shares
行首文本“共享”,.*?
非贪婪任意数量的字符,<?before ^^Shares | $ >
正向前瞻,表示在看到?before
下一个^^Shares
记录模式时或$
在文件本身的末尾之前/末尾停止该模式。在链中的第二个操作中,
grep
用于仅返回那些包含Listable
块的记录。输入示例:
示例输出:
注意:了解语言内部如何表示数据通常很有启发性,因此以下是ing 到单独的记录之后
comb
但在ping 所需块之前的输出:grep
https://docs.raku.org/language/operators#Operators
https://docs.raku.org/routine/comb
https://docs.raku.org/routine/grep
https://raku.org