找出文本文件中的哪一行与单词匹配

找出文本文件中的哪一行与单词匹配

有什么方法可以找出文本文档的哪一行是某个与模式匹配的单词,例如使用 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

  1. 珀尔

     perl -lne 'print $. if /pat/' file
    
  2. awk

     awk '/pat/{print NR}' file
    
  3. sed

     sed -n '/pat/=' file
    

答案3

使用(以前称为 Perl_6)

raku -ne 'state $i=0; ++$i; put $i if /pat/;' 

上面的 Raku 代码将打印匹配的行的行号pat,每行一个匹配。如果您希望所有匹配项都在一行上,请替换put $iprint "$i ".

作为解释,Raku 中省略了 Perl 中的许多特殊变量。相反,Raku 允许state变量仅启动一次。该语法和分号分隔的“类 C”语法可用于 Raku 中的条件行编号。在上面的第一条语句中,$i使用关键字声明了一个变量state,这意味着它将被初始化一次。该state关键字与传统的 Perl/Raku 命令行标志无缝配合-ne,因此$i可以在第二个语句中使用 递增,并且可以使用第三个语句++$i匹配 的值。$iput

请注意,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

https://docs.raku.org/syntax/state
https://raku.org

相关内容