Regex 在终端中按开始和结束模式选择文本范围

Regex 在终端中按开始和结束模式选择文本范围,regex,shell,awk,sed,terminal,Regex,Shell,Awk,Sed,Terminal,给定一个开始和结束模式,我想选择该范围内的所有文本,包括与此模式匹配的新行 例如 ➜ diskutil list /dev/disk0 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *251.0 GB disk0 1:

给定一个开始和结束模式,我想选择该范围内的所有文本,包括与此模式匹配的新行

例如

➜  diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            250.1 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3

/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                            Macintosh HD           +249.8 GB   disk1
                                 Logical Volume on disk0s2
                                 A200C898-46E7-4C85-B946-35677A6880C6
                                 Unlocked Encrypted

/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk2
   1:                        EFI EFI                     209.7 MB   disk2s1
   2:                  Apple_HFS m                       999.3 GB   disk2s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk2s3
我对选择外部驱动器及其所有条目感兴趣。我想的开始模式应该是/外部的,物理的/而结束模式可能应该是/^$|^\n$/

最终结果应该是

diskutil list | "magic"
/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk2
   1:                        EFI EFI                     209.7 MB   disk2s1
   2:                  Apple_HFS m                       999.3 GB   disk2s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk2s3
使用地址范围:

diskutil list | sed '/(external, physical)/,/^$/!d;'
工作原理:

/外部,物理/,/^$/:从匹配外部,物理的行到下一个空行 !d:不要删除行 awk版本:awk'/start string/,/end string/'输入


如果要输出的范围不在文件末尾,请使用:

$ awk '/^\/dev\/disk/{f=0} /external, physical/{f=1} f' file
/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk2
   1:                        EFI EFI                     209.7 MB   disk2s1
   2:                  Apple_HFS m                       999.3 GB   disk2s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk2s3
解释:

/^\/dev\/disk/ { f=0 }        # flag down at new disk entry
/external, physical/ { f=1 }  # flag up at desired start point
f                             # output when flag up

谢谢你,今天你让一些苹果用户非常高兴:请看我在2017年3月21日12:11的帖子上的回复
/^\/dev\/disk/ { f=0 }        # flag down at new disk entry
/external, physical/ { f=1 }  # flag up at desired start point
f                             # output when flag up