Grep为行号后的下一个空白行

时间:2013-01-11 09:33:39

标签: linux shell sed grep

我有一个大文件,其中包含不同制表符分隔数据的表格。不同的表格用空行分隔。

我有一个特定表的起始行号,我需要检索整个表。

如何使用grep(或类似的东西)获取特定行号后的下一个空行的行号?

4 个答案:

答案 0 :(得分:4)

为此使用sed,这应该可以解决问题:

sed -n '1,/^\s*$/p' file

只需替换逗号前的第一个数字,在这种情况下1使用行号,demo来打印给定行号中的每个表:

$ cat file
one
two
three

five
six
seven

nine
ten
eleven

$ sed -n '1,/^\s*$/p' file
one
two
three

$ sed -n '5,/^\s*$/p' file
five
six
seven

$ sed -n '9,/^\s*$/p' file
nine
ten
eleven

使用-n选项打开每行的默认打印,p标记sed从行号打印到与正则表达式匹配的第一行:

^     # Matches the start of the line
\s*   # Matches zero or more whitespace characters
$     # Matches the end of the line

使用sed -n 'A,Bp'格式A,其中Bsed可以是行号或正则表达式,您可以轻松打印文件的子部分。

使用$ sed -n '1,/^\s*$/{=}' file | tail -1 4 $ sed -n '5,/^\s*$/{=}' file | tail -1 8 $ sed -n '9,/^\s*$/{=}' file | tail -1 12 打印下一个空白行的行号:

$ sed -n '/^\s*$/{=}' file
4
8
12

或者只打印所有空白行

awk

使用tail获取下一个空白行号不需要使用$ awk 'NR>=1 && /^\s*$/{print NR;exit}' file 4 $ awk 'NR>=5 && /^\s*$/{print NR;exit}' file 8 $ awk 'NR>=9 && /^\s*$/{print NR;exit}' file 12 $ awk '/^\s*$/{print NR}' file 4 8 12

awk

如果它更清楚,您可以使用-v

使用$ awk -v start=1 'NR>=start && /^\s*$/{print NR;exit}' file 4 $ awk -v start=5 'NR>=start && /^\s*$/{print NR;exit}' file 8 $ awk -v start=9 'NR>=start && /^\s*$/{print NR;exit}' file 12 传递变量
{{1}}

答案 1 :(得分:2)

Perl让这很简单。要将第31行中的所有行提取到 some_file 中的下一个空白行:

$ perl -wne 'print if 31 .. /^$/' some_file

答案 2 :(得分:0)

使用awk的一种方式:

awk -vs=$sta '{ok=NR>=s}ok&&!$0{exit;}ok&&$0'

$sta是一个变量,用于存储起始行号。如果我们用sudo_O的输入示例用起始行nr = 5进行测试,它看起来像:

kent$  sta=5

kent$  echo "1
2
3

5
6
7

9
10
11"|awk -vs=$sta '{ok=NR>=s}ok&&!$0{exit;}ok&&$0'
5
6
7

请注意,sed的地址将包含边界,这意味着目标表之后的空行也将被打印出来。这个awk单行程不会打印它。这取决于你想要的输出。

编辑,以防您只想获得下一个空行号

awk -vs=$sta 'NR>=s&&!$0{print NR;exit;}' file

答案 3 :(得分:0)

在下面的命令中,5是您已知的表格行号

perl -lne 'exit if(/^$/ && $.>5);if($.>=5){print}' your_file