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

发布于 2024-09-25 04:19:23 字数 906 浏览 6 评论 0原文

我有以下形式的行,

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

我想将所有 path1,size1 except lastplace,-1 替换为 newPath,newSize > 这样看来

parts=newPathX,newSizeX,lastPath,-1

我想出了如何使用“,”字符的至少一个实例来完成此操作,如下所示,

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 也可以。

I have lines of the form

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

I want to replace all path1,size1 except lastplace,-1 with newPath,newSize so that it looks like

parts=newPathX,newSizeX,lastPath,-1

I figured how to do it using at least one instance of ',' char as follows

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

but this breaks if the list only has the last path and size. For example, I want

parts=lastPath,-1

to be transformed to

parts=newPathX,newSize,lastPath,-1

So I tried to fix this with a conditional in bash:

egrep -i '^parts=.*,.*,-1

I would like to know a pure sed solution as I can quickly understand it, but awk will do too.

$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

I would like to know a pure sed solution as I can quickly understand it, but awk will do too.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心安伴我暖 2024-10-02 04:19:23

尝试使用 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

Try using 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
ヤ经典坏疍 2024-10-02 04:19:23
sed '/^parts=.*,.*,-1$/ s|=.*,\([^,]*,-1\)$|=newPathX,newSizeX,\1|gi'  

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

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

Sometimes, its also very simple in sed ;-). Just add a filter before to avoid your exception case

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文