私のディレクトリに「=」で始まる行を含む多くの.txtファイルがあります。
例:a.txtには次の行があります(開始部分にスペースを含めます)。
=putSomething here;
上記の行に一致するgrepクエリをどのように書くことができますか?私は次を試しました。
find . -name "*.txt" | xargs grep -rn "^[=].*$"
答え1
このサンプルファイルを見てみましょう。
$ cat file.txt
=putSomething here;
.txt
現在のディレクトリでこれらのファイルをすべて見つけるには、次の手順を実行します。
$ grep -n '^[[:space:]]*=' *.txt
file.txt:1: =putSomething here;
.txt
現在のディレクトリでこれらのファイルをすべて探したい場合すべてのサブディレクトリ、以下を使用します。
$ grep -rn '^[[:space:]]*=' --include '*.txt'
subdir/another.txt:1: =putSomething here;
file.txt:1: =putSomething here;
ノート
find
そしてxargs
ここでは必要ありません。この-r
オプションを使用すると、grep
サブディレクトリを繰り返し検索できます。--include '*.txt'
grep
globに一致するファイルを制限します*.txt
。^
行の先頭に一致します。[[:space:]]*
ゼロ個以上の空白文字と一致します。=
等号と一致します。 POSIX正規表現には特別な内容がないため、=
他の文字と同じように処理できます。grep regex を終了しても
.*$
一致する行は変更されません。.*$
後ろに文字がある場合、または文字がない場合は一致します。使用する唯一の理由.*$
は、grepが強調表示する一致するテキストを変更することです。
答え2
で始まる行は=
正規表現に変換されます^=
。
検索コマンドは次のようにする必要があります。
find . -name "*.txt" | xargs grep '^='
または、より良い方法は次のとおりです(無駄な使用を避けるためxargs
)。
find . -type f -name "*.txt" -exec grep '^[[:space:]]*=' {} +
(ここではエンディングのため、複数の+
ファイルに対して1つのgrepしか実行されませんでした。)
答え3
以下のコマンドを試しましたが、うまくいくようです。
grep -rn '^ *=' **/*txt
答え4
grep
再帰と次の選択肢としてxargs
:
$ find /dir -type f -name "*.txt" -exec grep -q '^[[:space:]]*=' {} ';' -print
/dir
名前が指定されたパターンと一致する(および下)すべての一般的なファイルを見つけます。これらのファイルごとにgrep -q '^[[:space:]]*='
終了ステータスが0の場合(パターンがファイルのどこかに一致する)、その名前が出力されます。
または行自体を見たい場合は、次のようにします。
$ find /dir -type f -name "*.txt" -exec grep '^[[:space:]]*=' {} '+'
これにより、+
各呼び出しにできるだけ多くのファイル名が提供されますgrep
が、最初の例のように使用すると、;
一度に1つのファイルのみが提供されます。