2016-10-30 8 views
0

私はファイル名を変更する必要のあるファイルのリストを生成するbashコマンドを持っています。 ので、私はこのようなものを使用して考えた:sedを使ってawk変数を変更する方法

mycommand | awk {mv $1 altered$1} 

問題は、2番目の$ 1 sedのいくつかの正規表現に置き換え変更する必要があるということです。 sedを2番目のパラメータにどのように適用できますか?

$()と|で試しましたが、うまくいきません。

私も

awk '{print $1 sed "s/[^A-Za-z0-9._-]/_/g" <<< $1}' 
awk: cmd. line:1: Unexpected token 
+0

あなたのコマンドから返されたファイル名のリストをループし、 'sed'でそれらを修正することを考えましたか? 'for $(mycommand); do mv $ filename $(sed "s/[^ A-Za-z0-9 ._-]/_/g" <<< $ filename);完了しました。 – Abdou

+0

ファイル名に空白が含まれている場合、 'for filename in $(mycommand)'は失敗します。 'while'ループはそれを避けることができます。 – John1024

+0

'awk'は' sub() 'と' gsub() '関数を持ち、' ​​sed 's/str/repl /'ができることのほとんどを実行できることを思い出してください。必要なものを得るためにいくつかの '[g] sub(/ regex /、" repl "、" str ")操作を行う必要があるかもしれません。がんばろう。 – shellter

答えて

1

mvは、awkコマンドではありませんみました。あなたはシェルが必要です。試してみてください:

mycommand | while IFS= read -r f; do mv "$f" "${f//[^A-Za-z0-9._-]/_}"; done 

これは、ファイル名が改行で区切られていることを前提としています。ファイル名に改行が含まれていない限り、これは問題ありません。信頼性を高めるために、mycommandとNULをセパレータとして使用するようにwhileループを修正する必要があります。これは順番に、変数fに、それぞれの行を読み込み、ループを開始

  • while IFS= read -r f; do

    :仕組み

    IFS=は、先頭または末尾の空白を1行に保持するようにシェルに指示します。 mycommandが余分な先頭または末尾の空白を生成する場合は、これを削除します。

    -rは、バックスラッシュをそのまま入力に保存するようにシェルに指示します。

  • mv "$f" "${f//[^A-Za-z0-9._-]/_}"

    これは、ファイルの名前を変更します。

  • done

    これはwhileループの終わりを知らせます。

1

サブシェルは受け入れていますか?そうであれば以下のようにあなたが行うことができ、簡単な方法:

mv `mycommand | awk '{print $1}'` {altered$1} 
0

使用rename(常に必要のutil-linuxのパッケージを経由して、のDebianベースのディストリビューションにインストール):

rename 's/^/altered/' $(mycommand) 
関連する問題