Редактирование разделенного запятыми списка путей, пар размеров - PullRequest
1 голос
/ 28 сентября 2010

У меня есть строки вида

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

Я понял, как это сделать, используя хотя бы один экземпляр of ',' 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 ]

1 голос
/ 28 сентября 2010

Попробуйте использовать 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
0 голосов
/ 14 апреля 2015
sed '/^parts=.*,.*,-1$/ s|=.*,\([^,]*,-1\)$|=newPathX,newSizeX,\1|gi'  

Иногда это также очень просто в sed ;-).Просто добавьте фильтр прежде, чтобы избежать исключений

...