有什么方法可以找出文本文档的哪一行是某个与模式匹配的单词,例如使用 grep 或其他东西。谢谢。
答案1
是的,可以-n
选择grep
.
从man grep
:
-n, --line-number
Prefix each line of output with the 1-based line number within its input file.
例如,如果您有一个名为以下内容file.txt
的文件:
this is
foo test
and this is
bar test
现在的输出grep -n "test" file.txt
:
$ grep -n "test" file.txt
2:foo test
4:bar test
这里 2 和 4 表示找到模式的行号。
答案2
该grep
方法是最简单的,但这些都会打印匹配行的行号pat
:
珀尔
perl -lne 'print $. if /pat/' file
awk
awk '/pat/{print NR}' file
sed
sed -n '/pat/=' file
答案3
使用乐(以前称为 Perl_6)
raku -ne 'state $i=0; ++$i; put $i if /pat/;'
上面的 Raku 代码将打印匹配的行的行号pat
,每行一个匹配。如果您希望所有匹配项都在一行上,请替换put $i
为print "$i "
.
作为解释,Raku 中省略了 Perl 中的许多特殊变量。相反,Raku 允许state
变量仅启动一次。该语法和分号分隔的“类 C”语法可用于 Raku 中的条件行编号。在上面的第一条语句中,$i
使用关键字声明了一个变量state
,这意味着它将被初始化一次。该state
关键字与传统的 Perl/Raku 命令行标志无缝配合-ne
,因此$i
可以在第二个语句中使用 递增,并且可以使用第三个语句++$i
匹配 的值。$i
put
请注意,Raku 中的增量(非条件)行编号是通过另一种方法完成的,该方法使用$
可以递增/递减(例如++$
或$++
)的匿名状态变量。因此,对匹配模式的每个实例进行编号可以像这样完成(使用 Raku 的=>
“fat-arrow”哈希构造函数)。使用put
而不是say
获取制表符分隔的输出:
raku -ne 'state $i=0; ++$i; say (++$ => $i) if /4/;'
输入示例(注意第一行是空白):
0
01
012
0123
01234
012345
0123456
01234567
012345678
0123456789
示例输出(上面的最终代码,'ordinal-instance' =>
'line-number'。使用put
而不是say
获取制表符分隔的值):
1 => 6
2 => 7
3 => 8
4 => 9
5 => 10
6 => 11