ドット文字を使用して改行文字を一致させるために、findコマンドで正規表現を使用しようとしています。これは通常s
修飾子を使用して行われます。ただし、正規表現エンジンによって形式が異なるため、findコマンドが改行と一致するように正規表現を作成する方法を正確に知ることはできません。たとえば、名前に改行を含むファイルを含むすべてのファイルと一致するように、次の簡単なコマンドをどのように変更しますか?
find /home/user -regex ".*"
私はこれを試してみましたが、"(?s).*"
おそらく"/.*/s"
他のいくつかを試してみました。
ベストアンサー1
私のバージョンのGNU findは、以下を使用して選択できるいくつかの正規表現バリアントをサポートしています-regextype
。
有効なタイプは、「findutils-default」、「awk」、「egrep」、「ed」、「emacs」、「gnu-awk」、「grep」、「posix-awk」、「posix-basic」、「posix- 「です。 「egrep」、「posix-extend」、「posix-minimal-basic」、「sed」。
ほとんどすべてがドットマッチ改行文字を作成します...を除いて、emacs
これがデフォルトです。
だから他のものを使用してください。posix-extended
十分に正気であるかもしれません。
$ touch hello $'new\nline'
$ find . -type f -regex '.*'
./hello
$ find . -type f -regextype posix-extended -regex '.*'
./hello
./new?line
別のランニングを実行している場合は、find
マイルが異なる場合があります。クイックテストの後、私のMacではデフォルトで改行文字と一致します.
。
繰り返しますが、単純なパターンでは、-name
whichを使用してシェルグローバル変数を取ることができます(そして改行の問題はあってはいけません)。
これはPCRE / Perl正規表現の機能のように見えますが、サポートされていません(?s)
。find
の場合、生モードのみが/.*/s
可能find
で、区切り文字がないため、末尾のオプションはありません。