Grepはデフォルト名から正規表現を見つけましたが、フルネームを返します。

Grepはデフォルト名から正規表現を見つけましたが、フルネームを返します。

テキストファイルにファイルのリストがあるとしましょう。

...
/foo/barfoo
/bar/foo/foobar
/foobar/bar/foo
...

このテキストファイルを検索するスクリプトがあります。検索コマンドと同様に、ファイルのデフォルト名を検索できるようにしたいです。これまで私はこのgrepコマンドを使用してきましたが、grep -E */.*${1}[^/]*$正規表現をgrepしたい場合を除いてうまくいきます。したがって、上記の例で「foo」で始まるファイルを見つけるにはそうしますが、完全正規myscript --basename ^foo表現はgrep -E */.*^foo[^/]*$明らかに失敗するため失敗します。 xargsを使用して各エントリをデフォルト名に挿入することを検討しましたが、最後にフルファイルパスを出力するにはスクリプトが必要です。

どんなアイデアがありますか?私はPOSIX準拠を好むが、GNUismsも良い。

答え1

foo基本名の先頭で一致する必要がある場合:

< inputfile grep '/foo[^/]*$'
  • /foo[^/]*$:文字列の後に文字列の終わりではなく、/foo任意の数の文字が続く文字列と一致します。/

ifは、fooデフォルト名のどこにでも一致できます。

< inputfile grep 'foo[^/]*$'
  • foo[^/]*$:文字列の後に文字列の終わりではなく、foo任意の数の文字が続く文字列と一致します。/

答え2

grepPCRE(Perl互換正規表現)をサポートする場合:

$ grep -Po '.*/\Kfoo[^/]*$' file.txt 
foobar
foo
  • .*/最後の項目と一致し、/一致\Kを削除します。

  • foo[^/]*$次に始まるファイル名を探します。foo

関連情報