Bashスクリプトを作成しようとして問題が発生しました。grep出力するとき、(通常)多くの行を返します。これらの各出力行に文字列のプレフィックスとサフィックスを付けたいと思います。
また、次のように配管lsしていることに注意してくださいgrep:
ls | grep
Bashスクリプトを作成しようとして問題が発生しました。grep出力するとき、(通常)多くの行を返します。これらの各出力行に文字列のプレフィックスとサフィックスを付けたいと思います。
また、次のように配管lsしていることに注意してくださいgrep:
ls | grep
回答:
sedを使用:
ls | grep txt | sed 's/.*/prefix&suffix/'
sedのスーパーセットであることgrep:ls | sed -n '/txt/s/.*/prefix&suffix/p'またはls | sed -n 's/.*txt.*/prefix&suffix/p'
で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スタイル設定したり、に基づいてさまざまなタスクを実行したりできます$_。
“emを使用します。
この場合、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ます。マニュアルページの「規格適合」セクションを確認してください)
不要外部プログラムとの可能な代替として、bashしているcompgen他のものの間に相当グロブ、拡張する、lsオプションなしでは:
compgen -P "someprefix>" -S "<somesuffix" -G "pattern"
これは、改行を含む空白を含むファイル名を処理します。compgen -G "*"プレーンと同じ出力を提供する必要がありますls(ただし、ls *まったく異なることに注意してください)。まだ必要ですがgrep、これは問題を解決する場合もしない場合もありますが、言及する価値があります。
ls-それは悪いjujuです。また、それはする必要がありgrepますか?そして、あなたはいくつかの出力例を与えることができますか?