2017-09-16 5 views
-1
file=/home/root/customers_and_contacts.txt 
month[1]="January" 
month[2]="Febuary" 
month[3]="March" 
month[4]="April" 
month[5]="May" 
month[6]="June" 
month[7]="July" 
month[8]="August" 
month[9]="September" 
month[10]="October" 
month[11]="November" 
month[12]="December" 

cat $file | sed "s/\b[0-9]\([0-9]\)-\?\([0-9]\{2\}\)-\?\([0-9]\{4\}\)\b/$(month[\1])" 

わかりやすくするために、私は上記の文書を作成しました。基本的にcustomers_and_contacts.txtには、月を実際の月の名前に変換したい日付が含まれています。キャプチャしたグループをsedの配列インデックスとして送信

Month[0]

\1はのは、入力ファイルがnが含まれていると仮定しましょう

あなたがそれらを一緒に入れると、そうでない

編集----

を動作しているように動作するようです次のような行数:

08-06-1998 

    02-03-2014 

出力ファイルには、次の

August 06-1998 

    February 03-2014 
+1

このようにすることはできません。コマンドの置換 '$(month [\ 1])'は、sedがコマンド全体を見る前にシェルによって展開されます。あなたの入力ファイルはどのように見えますか? –

+0

あなたの質問は簡潔で、テスト可能なサンプル入力と期待される出力を表示するため、私たちはあなたを助けることができます。今まであなたは私たちにスクリプトを見せてくれました**あなたがしたいことは何でもしていますが、私たちはそれがあなたのものであることを示していません**あなたを助けるのに最高の方法を推測する。それがはっきりしない場合は[ask]を参照してください。 –

+0

あなたの入力ファイル '/ home/root/customers_and_contacts.txt'の内容と期待される結果を投稿してください。 – RomanPerekhrest

答えて

0

まずようになっているはずです、あなたはバグを持っている:それはおよそmonth[1] command not foundや文句を言うだろう

そうでない場合
${month[1]} 

:bashの配列の要素にアクセスするには、中括弧を使用します何か。

第二に、bashがそう\ 1ので、次のコマンド(${month[\1]}Januaryに展開を送信されます、あなたは上記のあなたのバグを修正したと仮定すると、サブシェルにコマンドを送信する前に、まずすべての変数を拡大することは、単に1 bashのです):それはSED単一パターン置換を超えて複数の代替ロジックを必要とするため

cat /home/root/customers_and_contacts.txt | \ 
    sed "s/\b[0-9]\([0-9]\)-\?\([0-9]\{2\}\)-\?\([0-9]\{4\}\)\b/January" 

最後に、オリジナルのデザインは、あなたが意図したものしないでしょう。

あなたは、複数の-eオプション使ってsedの中に複数の代替ロジックを行うことができます:あなたはあなたの元のコードで(..)空白を埋めることができ

cat $file | \ 
    sed -e "s/..1../..${month[1]}../" \ 
     -e "s/..2../..${month[2]}../" \ 
     -e "s/..3../..${month[3]}../" \ 
     -e.. 

を。

+0

"バグ "は単にタイプミスです。上記のように、指定されたインデックスがハードコードされている場合、配列を展開することができます。これとは対照的に、私はキャプチャされたグループにも同様に表示させることができます。しかし、それらを組み合わせるとうまくいきません。 – Schylar

+0

複数の置換ロジックに関する私の答えの2番目の部分をお読みください。 sedを使用した1回の置き換えは、1月の番号(コードでは1月)を置き換えます。 – Martin

関連する問題