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を使用できますが、「*」は先行する「.」と一致します。名前†はとは異なるため、何でも意味します。ls
ls .
bash
[^.]*
いいえ先頭「。」- MYPATTERNは正しいPOSIX EREです(デフォルトのタイプはEmacsです。を参照)。ここ)、しかし、フルファイル名(
./
プレフィックスを含む).*thing.*
と一致する必要があるためthing
- あなたはできますおそらく
-name
どちらも代わりに/のいずれかを使用してください-regex
(例:-regex "[^.]」私のパターン。」 -printf
サポートする多くのこと%n
は変更されていないファイルまたはディレクトリ名です。find
それとはls
対照的に、ファイル名のリストはソートされません。- ファイル名が現在のロケールで有効なテキストで構成されているとします。
†(バージョンによって異なる場合があります
find
。マニュアルページの「標準適合性」セクションを確認してください。)
外部プログラムを必要としない可能な代替手段として、特にオプションなしでグローバル変数を拡張しますbash
。compgen
ls
compgen -P "someprefix>" -S "<somesuffix" -G "pattern"
改行を含むスペースを含むファイル名を処理します。compgen -G "*"
通常の出力と同じ出力を提供する必要がありますls
(ただし、これはls *
まったく異なる点に注意してください)。それでも必要ですgrep
。これは問題を解決することも解決しないかもしれませんが、言及する価値があります。
答え4
そしてawk
ls | grep | awk '$0="prefix"$0"suffix"'
"prefix"
そして"suffix"
文字列リテラルなので、テキストを好きなように置き換えてください。