如何使用 sed 有选择地删除前导零

如何使用 sed 有选择地删除前导零

我如何0使用以下命令替换/删除其中的sed

2001:0db8:03cd:0000:0000:ef45:0006:0123

使它看起来像这样:

2001:db8:3cd:::ef45:6:123

:中间有 8 个 4 的除法。

第4块一定不能丢任何 0和其他的,只有领导0可以去掉。

答案1

因此,您想要删除连续的0s,但前提是它们前面有冒号。

sed -e 's/:00*/:/g'

答案2

类似的方法使用awk

awk '{gsub(/:0*/,":")}1' file
2001:db8:3cd:::ef45:6:123

答案3

如果您仍然对如何删除除前 4 位数字之外的任何零感兴趣,您可以这样做:

sed 'H;g;s/\(\n\([^:]*\)\)*0*/\2/g
' <<\IN
2001:0db8:03cd:0000:0000:ef0405:00060:0123
IN

输出

2001:db8:3cd:::ef45:6:123

好的,所以这全局匹配零个或多个换行符序列,后跟零个或多个非冒号字符,或者零个或多个零。第一个序列分为两个子组 - 一个包含 ewline \n,另一个不包含。这样做的一个是\1- 但不这样做的子群 - 并且取代它 - 是\2。因此多余的\newline 字符被删除。任何不在该序列中的匹配零都是不是根本就没有被保存——所以它们也被删除了。

换行符仅首先用 old 检索- 它会在ewline 字符H后面附加一行以保留空格\n(总是从空开始)- 然后get -通过覆盖模式空间g来 ets旧空间。h

答案4

sed -r '/^..../s/:0+/:/g'

还好吗? (吉尔斯改进了答案,保持前 4 个字符不变)

相关内容