
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 '/pat/{print NR}' file
sed
sed -n '/pat/=' file
答え3
使用幸せ(以前のPerl_6)
raku -ne 'state $i=0; ++$i; put $i if /pat/;'
上記のRakuコードは、一致する行の行番号を各一致ごとにpat
1つずつ印刷します。すべての一致を1行に表示するには、にput $i
置き換えますprint "$i "
。
説明すると、Perlの多くの特殊変数がRakuから省略されました。対照的に、Rakuはstate
変数を一度だけ開始することを可能にします。この構文とセミコロンで区切られた「Cに似た」構文は、Rakuの条件付き行番号付けに使用できます。上記の最初の文では、$i
キーワードを使用して変数を宣言しました。state
これは、変数が一度初期化されることを意味します。このstate
キーワードは既存のPerl / Rakuコマンドラインフラグとシームレスに機能するため、-ne
2$i
番目のステートメントでincrementを使用でき、++$i
3番目のステートメントと一致する値を使用できます。$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