コマンドからの各出力行のプレフィックスおよびサフィックス文字列


16

Bashスクリプトを作成しようとして問題が発生しました。grep出力するとき、(通常)多くの行を返します。これらの各出力行に文字列のプレフィックスとサフィックスを付けたいと思います。

また、次のように配管lsしていることに注意してくださいgrep

ls | grep

2
解析すべきではありませんls-それは悪いjujuです。また、それはする必要がありgrepますか?そして、あなたはいくつかの出力例を与えることができますか?
Sobrique

1
ファイル名に改行が含まれている場合、スクリプトに何をさせますか?
タイViinikka

回答:


26

sedを使用:

ls | grep txt | sed 's/.*/prefix&suffix/'

3
または、sedのスーパーセットであることgrepls | sed -n '/txt/s/.*/prefix&suffix/p'またはls | sed -n 's/.*txt.*/prefix&suffix/p'
ステファンChazelas

@StéphaneChazelas:このヒントをありがとう。
サイラス

5

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 grepgrepコマンドのようにパターンを取ることができますが、ファイルテストを適用するなどのこともできます。

例えば

grep {-d} glob "*" #filters directories.
grep { (stat)[9] > time() - 60 } glob "*" #reads file mtime and compares. 

grepデフォルトのイテレータ内では$_現在の要素値に設定されているため、正規表現を適用sed/ grepスタイル設定したり、に基づいてさまざまなタスクを実行したりできます$_


「sed」を使用した最初の例で、変数を接尾辞/接頭辞として含めるにはどうすればよいですか?
SpecialBomb

引用符を変更し、emを使用します。
Sobrique

2

この場合、GNUをfind使用すると、これらのすべてを一度に行うことができ、パイプの削除や、面倒な可能性のある以下の解析が可能になりますls

find . -maxdepth 1 -name '[^.]*' \
  -regextype posix-extended -regex "MYPATTERN" \
  -printf 'SOMEPREFIX %f SOMESUFFIX\n'

findもちろん、他のコマンドの出力を任意に変更する良い方法ではありません!)

いくつかのメモ:

  • -maxdepth 1また-name [^.]*、名前の一致をプレーンls(またはls .)と同じように機能させます。任意のシェルスタイルのグロブを使用できますが、「*」は先頭の「。」と一致することに注意してください。名前とは異なりbash、したがって、先頭に「。」がない[^.]*ものを意味します。
  • MYPATTERNは適切なPOSIX ERE(デフォルトタイプはEmacs、こちらを参照)です、ファイル名全体と一致する必要があるため.*thing.*、単にthing
  • おそらく、両方の代わりに-name/ -regexのいずれかを使用できます(たとえば、-regex "[^。]。MYPATTERN。 "
  • -printfサポートの物事の多くは%n簡素ファイルまたはディレクトリの名前です。

(これはバージョンによって異なりfindます。マニュアルページの「規格適合」セクションを確認してください)

不要外部プログラムとの可能な代替として、bashしているcompgen他のものの間に相当グロブ、拡張する、lsオプションなしでは:

compgen -P "someprefix>" -S "<somesuffix" -G "pattern"

これは、改行を含む空白を含むファイル名を処理します。compgen -G "*"プレーンと同じ出力を提供する必要がありますls(ただし、ls *まったく異なることに注意してください)。まだ必要ですがgrep、これは問題を解決する場合もしない場合もありますが、言及する価値があります。


0

sedそして、find(代わりに即値の)環境変数を渡すために、あなたの接頭辞/接尾正規表現キーの文字が含まれるか、必要な場合ならば解決策が求められていxargs+ echoより、ここで適切な場合があります。

環境変数あり:

ls | grep p | xargs -I % sh -c "echo $PATH/%"

インラインで:

ls | grep p | xargs -I % sh -c "echo `pwd`/%"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.