コマンドの各出力行のプレフィックスとサフィックス文字列

コマンドの各出力行のプレフィックスとサフィックス文字列

Bashスクリプトの作成に問題があります。出力するとgrep(通常)多くの行が返されます。各出力行に文字列プレフィックスとサフィックスを追加したいと思います。

lsまた、私は次のパイプラインにあることを指摘したいと思いますgrep

ls | grep

答え1

sedを使用してください:

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

答え2

そしてsed

ls | grep pattern | sed -e 's/^/prefix/' -e 's/$/suffix/'

ただし、これを行うと、ファイル名に改行が含まれている問題やあらゆる種類の解析の問題が発生するため、ls一般的に悪い考えです。

パールを使って

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スタイル正規表現を適用するか$_

答え3

この場合、GNUをfind使用すると、パイプと潜在的に面倒な解析を削除して、すべての操作を一度に実行できますls

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

findもちろん、これは他のコマンドの出力をランダムに修正する良い方法ではありません!)

いくつかの注意:

  • -maxdepth 1名前一致操作を一般(または)-name [^.]*と同じにします。すべてのシェルスタイルのglobを使用できますが、「*」は先行する「.」と一致します。名前はとは異なるため、何でも意味します。lsls .bash[^.]*いいえ先頭「。」
  • MYPATTERNは正しいPOSIX EREです(デフォルトのタイプはEmacsです。を参照)。ここ)、しかし、フルファイル名(./プレフィックスを含む).*thing.*と一致する必要があるためthing
  • あなたはできますおそらく-nameどちらも代わりに/のいずれかを使用してください-regex(例:-regex "[^.]」私のパターン。
  • -printfサポートする多くのこと%nは変更されていないファイルまたはディレクトリ名です。
  • findそれとはls対照的に、ファイル名のリストはソートされません。
  • ファイル名が現在のロケールで有効なテキストで構成されているとします。

(バージョンによって異なる場合がありますfind。マニュアルページの「標準適合性」セクションを確認してください。)

外部プログラムを必要としない可能な代替手段として、特にオプションなしでグローバル変数を拡張しますbashcompgenls

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

改行を含むスペースを含むファイル名を処理します。compgen -G "*"通常の出力と同じ出力を提供する必要がありますls(ただし、これはls *まったく異なる点に注意してください)。それでも必要ですgrep。これは問題を解決することも解決しないかもしれませんが、言及する価値があります。

答え4

そしてawk

ls | grep | awk '$0="prefix"$0"suffix"'

"prefix"そして"suffix"文字列リテラルなので、テキストを好きなように置き換えてください。


源泉:https://stackoverflow.com/a/2099492/2089675

関連情報