2014-02-12 147 views
0

我正在编写脚本,我需要在一行中搜索几个月,例如01,02 ... 12,并用它的缩写替换它。不过,尽管我需要搜索所有月份,但我只需要替换找到的月份编号的第一个实例即可。举例来说,如果我们有一个线,看起来像这样:第一次更换后停止sed

我需要sed来执行以下操作:

07年5月6日

我使用的电流命令产生:

May Jun Jul

这是不可取的。下面是我使用的是什么:

date=$(echo $line |cut -d , -f 1 | sed 's/-/ /g;s/:00//;s/:/ /g;s/01/Jan/;s/02/Feb/;s/03/Mar/;s/04/April/;s/05/May/;s/06/Jun/;s/07/Jul/;s/08/Aug/;s/09/Sep/;s/10/Oct/;s/11/Nov/;s/12/Dec/') 

感谢您的帮助先进

+2

你应该使用gnu [tag:date]而不是超长的正则表达式。 – BroSlow

+1

尝试在sed表达式中的数字前面插入^ ^。你最终会得到'date = $(echo $ line | cut -d,-f 1 | sed's/-// g; s /:00 //; s /://g; s/^ 01 /月/秒/^02 /月/秒/^03 /月/秒/^04 /月/秒/^05 /月/秒/^06月/ 6 /; S/^ 07/Jul /; s/^ 08/Aug /; s/^ 09/Sep /; s/^ 10/Oct /; s/^ 11/Nov /; s/^ 12/Dec /') – alvits

+0

脱字符('^')是,如果“05 06 07”出现在行的中间 - 因为'^'表示在行的开头。 – csiu

回答

1

与GNU日期

echo "05 06 07" | while read -r mon rest 
do 
    mon=$(date -d "2014-$mon-01" +%b) 
    echo $mon $rest 
done 
+1

这工作完美,谢谢! – OpenSrcFTW

1

试着这么做

> echo $line 
foo foo05 06 07 foo 02 
> [[ $line =~ [0-9]{2}' '[0-9]{2}' '[0-9]{2} ]] && date -d $(echo "${BASH_REMATCH[0]}" | tr ' ' '/') '+%b %d %y' 
May 06 07 
0

这是尴尬的,但它似乎工作:

... sed 's/-/ /g;s/:00//;s/:/ /g 
s/01/Jan/ 
t 
s/02/Feb/ 
t 
s/03/Mar/ 
t 
s/04/April/ 
t 
s/05/May/ 
t 
s/06/Jun/ 
t 
s/07/Jul/ 
t 
s/08/Aug/ 
t 
s/09/Sep/ 
t 
s/10/Oct/ 
t 
s/11/Nov/ 
t 
s/12/Dec/' 
+0

不完全。如果输入的内容类似06 05 07或07 06 04,那么您将分别得到06年5月07日或07年4月7日的内容。 – alvits

+0

@alvits:该死的,你说得对。你在上面的评论中提出的解决方案在各方面都比较好,事后看来很明显。 (有没有“facepalm”+“为什么我没有想到这个?”) – Beta