ドット文字を使用して改行文字を一致させるために、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
で、区切り文字がないため、末尾のオプションはありません。
答え2
注文する
find ~user
改行文字を含む名前を含むすべての名前が検索されます。-type f
一般的なファイルだけを探したい場合は、追加してください。
名前の一致を制限したくない場合は、名前のテストを使用しないでください。
部分文字列一致を使用して名前を制限するには、-name
テストでワイルドカードパターンを使用できます。*
どちらも通常の?
シェルとテストの両方-name
でワイルドカードパターンの改行と一致しますfind
。
標準を使用した例find
:
$ find . -name 'file?name'
./file
name
$ find . -name 'file*name'
./file
name
$ find . -name 'd*name'
./dir
name
$ echo ./d*name
./dir
name
誤解された質問に対する回答(「改行文字を含む名前を見つける方法」):
使用標準find
:
find ~user -name '*
*'
これをサポートするシェルでは、「C文字列」を使用してください(まだ標準を使用していますfind
)。
find ~user -name $'*\n*'
GNUで一般的に使用できる組み込み正規表現タイプはfind
改行文字と一致しないため、\n
上記のワイルドカードパターンのようにリテラル改行文字のみを使用できます。これは-name
、移植不可能なテストよりも標準的なテストを使用する方が-regex
容易であることを意味する。