编辑以逗号分隔的路径,大小对列表

时间:2010-09-28 05:44:28

标签: regex bash sed awk grep

我有

形式的行
parts=/a,1mb,/b/c,2gb,/zee/last,-1 #general form on next line
parts=path1,size1,...,lastPath,-1

我想将所有path1,size1 lastplace,-1替换为newPath,newSize,以便它看起来像

parts=newPathX,newSizeX,lastPath,-1

我想了如何使用至少一个实例的','char,如下

sed 's|^parts=.*,\(.*,-1\)$|parts=newPathX,newSizeX,\1|gi'  

但如果列表只有最后一个路径和大小,则会中断。例如,我想要

parts=lastPath,-1

转换为

parts=newPathX,newSize,lastPath,-1

所以我尝试用bash中的条件来解决这个问题:

egrep -i '^parts=.*,.*,-1$' $file
if [[ $? -eq 0 ]] ; then
    sed 's|^parts=.*,\(.*,-1\)$|parts='$new',\1|gi' $inp
else
    sed -i -e 's|^parts=|parts='$new',_gi' $file
fi

我想知道一个纯粹的sed解决方案,因为我可以很快理解它,但awk也会这样做。

2 个答案:

答案 0 :(得分:1)

尝试使用awk:

$ var='puthere=$place1,$size1,$place2,$size2,(..and so on..),$lastplace,-1'
$ echo "$var" | awk -F"[=,]" -vnp="$newplace" -vns="$newsize" '/puthere/{print "puthere="np,ns,$(NF-1),$NF}' OFS=","
puthere=test1,size1,$lastplace,-1

答案 1 :(得分:0)

sed '/^parts=.*,.*,-1$/ s|=.*,\([^,]*,-1\)$|=newPathX,newSizeX,\1|gi'  

有时,它在sed中也非常简单;-)。只需添加一个过滤器,以避免出现异常情况