2017-09-16 56 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