2017-09-16 55 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得到查看整個命令之前由shell擴展。你的輸入文件是什麼樣的? –

+0

[編輯]你的問題向我們展示簡潔,可測試的樣本輸入和預期的輸出,所以我們可以幫助你。到目前爲止,你只向我們展示了一個腳本,它不會**做你想做的事情,但沒有向我們展示你是什麼**做**想做的事我們只是做猜測如何最好地幫助你。看[問]如果不清楚。 –

+0

發佈您的輸入文件'/ home/root/customers_and_contacts.txt'的內容和預期結果 – RomanPerekhrest

回答

0

首先,你有一個缺陷:要訪問的bash數組的元素,你可以使用大括號:

${month[1]} 

否則,它會抱怨month[1] command not found或一些東西。其次,在將命令發送到子shell之前,bash將首先擴展所有變量,所以假設你修正了上面的bug,你將發送以下命令(${month[\1]}擴展爲January,因爲\ 1在bash中只有1 ):

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

最後,原始設計不會做你想要的,因爲它需要多個替換邏輯超越sed單個模式替換。

您可以在sed使用多個-e選擇做多的更換邏輯:

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

您可以在空白(..)與原有的代碼填寫。

+0

「Bug」只是一個錯字。如上所述,如果指定的索引是硬編碼的,我可以讓它擴展數組。相比之下,我也可以將抓取的組展示出來。但是當它們結合時,它不起作用。 – Schylar

+0

閱讀關於多重置換邏輯的第二部分答案。一個使用sed的替換將只會替換一個月的數字(在您的代碼中,即1月份)。 – Martin