Bashスクリプトを記述しようとして問題が発生しました。 grep
が出力すると、(通常)多くの行が返されます。これらの出力行のそれぞれに文字列のプレフィックスとサフィックスを付けたいと思います。
また、次のようにls
をgrep
にパイプしていることにも注意してください。
ls | grep
Sedを使用:
ls | grep txt | sed 's/.*/prefix&suffix/'
sed
の場合:
ls | grep pattern | sed -e 's/^/prefix/' -e 's/$/suffix/'
ただし、これには改行のあるファイル名の問題、およびls
の解析に関するさまざまな問題があり、これは一般に悪い考えです。
Perlを使用
Perl -e 'print "prefix".$_."suffix\n" for grep { m/somepattern/} glob "*"'
注-Perlのgrep
は、grep
コマンドのようにパターンをとることができますが、ファイルテストの適用なども実行できます。
例えば。
grep {-d} glob "*" #filters directories.
grep { (stat)[9] > time() - 60 } glob "*" #reads file mtime and compares.
grep
内では、デフォルトのイテレータ$_
が現在の要素の値に設定されているため、sed
/grep
スタイルの正規表現を適用したり、さまざまなタスクに基づいて実行したりできます。 $_
.
この場合、GNU find
を使用すると、これらすべてを一度に実行できるため、ls
のパイプと潜在的に面倒な解析が不要になります。
find . -maxdepth 1 -name '[^.]*' \
-regextype posix-extended -regex "MYPATTERN" \
-printf 'SOMEPREFIX %f SOMESUFFIX\n'
(もちろん、find
は他のコマンドの出力を任意に変更する良い方法ではありません!)
いくつかのメモ:
-maxdepth 1
および-name [^.]*
名前の一致をプレーンなls
(またはls .
)。シェルスタイルのグロブを使用できますが、「*」は先頭の「。」と一致することに注意してください。名前で† bash
とは異なり、[^.]*
は、がない頭に「。」がないものを意味します。.*thing.*
だけではなくthing
-name
/-regex
両方ではなく(例:-regex "[^。]。MYPATTERN。"-printf
は、 たくさんのものをサポートしています 、%n
は、修飾されていないファイルまたはディレクトリの名前です† (ただし、これは
find
のバージョンによって異なる場合があります。manページの「STANDARDS CONFORMANCE」セクションを確認してください)
外部プログラムを必要としない可能な代替手段として、bash
にはcompgen
があり、これはとりわけ、オプションなしのls
と同等のグロブを展開します。
compgen -P "someprefix>" -S "<somesuffix" -G "pattern"
これは、改行を含む空白を含むファイル名を処理します。 compgen -G "*"
は、プレーンなls
と同じ出力を提供する必要があります(ただし、ls *
はまったく別のものです)。それでもgrep
が必要です。これで問題が解決する場合と解決しない場合がありますが、言及する価値はあります。
sed
およびfind
ソリューションは、プレフィックス/サフィックスに正規表現のキー文字が含まれている場合、または(即時値の代わりに)環境変数を渡したい場合、xargs
+ echo
の方が適切かもしれません。
環境変数あり:
ls | grep p | xargs -I % sh -c "echo $PATH/%"
インラインで:
ls | grep p | xargs -I % sh -c "echo `pwd`/%"