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
ますか?そして、あなたはいくつかの出力例を与えることができますか?