shell 如何使用SED删除文件最后一行的第二个逗号?

2uluyalo  于 2022-12-13  发布在  Shell
关注(0)|答案(3)|浏览(618)

我尝试使用sed搜索并删除第二行到最后一行的逗号,
这就是我现在所拥有的:

}
   "user-account-id": "John",
   "user-account-number": "v1001",
   "user-account-app": "v10.0.0",
   "user-account-dbase": "v10.1.0",
}

我希望最终的结果是这样的:

}
   "user-account-id": "John",
   "user-account-number": "v1001",
   "user-account-app": "v10.0.0",
   "user-account-dbase": "v10.1.0"
}

我以为我在贴出这篇文章一个小时后就找到了答案,但我错了,它不起作用。
使用以下任何组合进行试运行都不起作用:

sed '2,$ s/,$//' filename
sed '2,$ s/,//' filename
sed '2,$ s/,//g' filename
sed '2,$s/,$//' filename
sed '2,$s/,//' filename
sed '2,$s/,//g' filename

使用以下任何组合进行实际删除都不起作用:

sed -i '2,$ s/,$//' filename
sed -i '2,$ s/,//' filename
sed -i '2,$ s/,//g' filename
sed -i '2,$s/,$//' filename
sed -i '2,$s/,//' filename
sed -i '2,$s/,//g' filename

我以为用'2,$运行sed只会修改文件中的“倒数第二行”。
输出将删除每行中的逗号,这没有意义:

}
   "user-account-id": "John"
   "user-account-number": "v1001"
   "user-account-app": "v10.0.0"
   "user-account-dbase": "v10.1.0"
}
7vux5j2d

7vux5j2d1#

2,$是一个 range,从第二行开始,到最后一行结束(所以除了第一行之外的所有行)。在sed中,修改倒数第二行是困难的,例如Replace the "pattern" on second-to-last line of a file
但是在您的情况下,GNU sed有一个更简单的解决方案:
将整个文件视为一个字符串,并删除文件末尾的最后一个逗号和后面的}(忽略任何空格,甚至换行符)。

sed -Ez 's/,([ \t\r\n]*)\}([ \t\r\n]*)$/\1}\2/' file

如果你知道最后一个

rnmwe5a2

rnmwe5a22#

另一个策略:反转文件,删除 * 第一次 * 看到文件时的尾随逗号,然后重新反转文件:

tac file  | awk -v p=1 'p && /,$/ {sub(/,$/, ""); p=0} 1' | tac
nnt7mjpx

nnt7mjpx3#

这可能对你有用(GNU sed):

sed 'N;$s/,//;P;D' file

在整个文件中打开一个两行窗口,当遇到最后一行时,删除第一行,

相关问题