我有
形式的行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也会这样做。
答案 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中也非常简单;-)。只需添加一个过滤器,以避免出现异常情况