さて、正規表現を学び始めましたが、他の正規表現の代わりにどこでも正規表現を使う練習をしたいと思います。
拡張子を持つファイルを見つけようとしたときに、このような状況が発生しました。sh or md
$ find . regex ".*\.(sh|md)$"
.
./bogus.py
./cofollow.py
./data8.txt
./example.sh
./longest_word_2.sh
./posit_param.sh
./cobroadcast2.py
残念ながら、それは出力されます/bogus.py
。
BREルールを見つけて脱出しようとしました。()
$ find . -regex ".*\.\(sh|md\)$"
#get nothing return
一連の検索の最後に -regextype ソリューションを取得しました。正規表現 - ファイルの検索
$ find . -regextype posix-extended -iregex ".*\.(sh|md)$"
./example.sh
./longest_word_2.sh
./posit_param.sh
$ find . -regextype egrep -iregex ".*\.(sh|md)$"
./example.sh
./longest_word_2.sh
./posit_param.sh
./table_regex_bat.md
さらに、優れたモジュラーソリューション
$ find -type f | egrep ".*\.(sh|md)$"
./example.sh
./longest_word_2.sh
./posit_param.sh
./table_regex_bat.md
ただし、BSDには述部を使用してこれらの操作を実行するための近道があります-E
。
$ /usr/bin/find -E . -regex ".*\.(sh|md)$"
./example.sh
./longest_word_2.sh
./posit_param.sh
私は私のコードと技術を移植可能にするためにGNUツールだけを使用することにしました。
そのため、「find -regextype egrep」というエイリアスを指定し始め、
残念ながらfindはパスで$ 1を取得しました。
どうすれば問題を簡単に解決できますか?
ベストアンサー1
alias
パラメータを渡すために使用しないでください。移植性がなく、インタラクティブシェルでのみ便利です。代わりに関数を使用して、パラメータを目的のパスに渡してください。
regexFind() {
(( "$#" )) || { printf 'Insufficient arguments provided \n' >&2; return 1; }
find "$1" -regextype egrep -iregex ".*\.(sh|md)$"
}
関数を次のように呼び出します。
regexFind "/home/foo/bar"
また、結果に追加するには、bash
globファイルの独自の方法もあることに注意してください。機能するには、いくつかの拡張シェルオプションを有効にするだけです。このオプションを有効にし-s
て-u
無効にします。
nullglob
拡張されていないグローバル結果を有効な一致として無視できます。したがって、*.sh
andで終わるファイルを一致させたい場合は、*.md
特定のディレクトリに移動して次のようにします。
shopt -s nullglob
fileList=(*.sh)
fileList+=(*.md)
shopt -u nullglob
そして、以下のように結果を印刷してみてください。ファイル名がトークン化されないようにするには、拡張子を引用することを忘れないでください。
printf '%s\n' "${fileList[@]}"