2

我正在尝试编辑仅包含模式的第一个未注释行。由于有几个注释和未注释的类似行,我无法仅编辑它的第一次出现

原来的:

#/app2/rsync_root:IP1:IP2:IP3:IP4
/app2/rsync_root:IP1:IP2:IP3:IP4
/app2/rsync_root:IP1:IP2:IP3:IP4

编辑后的预期结果:

#/app2/rsync_root:IP1:IP2:IP3:IP4
/app2/rsync_root:ipaddr1:ipaddr2:ipaddr3:ipaddr4
/app2/rsync_root:IP1:IP2:IP3:IP4

怎么了:

#/app2/rsync_root:IP1:IP2:IP3:IP4
/app2/rsync_root:ipaddr1:ipaddr2:ipaddr3:ipaddr4
/app2/rsync_root:ipaddr1:ipaddr2:ipaddr3:ipaddr4

我可以使用 LHS 中的第一个冒号作为分隔符,因为后面的字段可以是任何内容。

现在我正在使用这个命令:

sed -ie '/^#/!s/:.*/:$ipaddr1:$ipaddr2:$ipaddr2:$ipaddr1/'
4

4 回答 4

2
perl -pe'/^#/ or s/:\K.*/.../ .. 0'

或者

perl -pe's/^(?!#)[^:]*:\K.*/.../ .. 0'
于 2012-12-17T10:41:53.087 回答
0

由于您使用的是非标准 sed (-i是非标准的),您可以简单地q在现有解决方案中添加一个标志:

sed -ie '/^#/!s/:.*/:$ipaddr1:$ipaddr2:$ipaddr2:$ipaddr1/q'
于 2012-12-17T12:57:12.067 回答
0
repl="ipaddr1:ipaddr2:ipaddr3:ipaddr4"
awk -v r="$repl" 'found==0 && !/^#/ {sub(/:.*/, ":" r); found=1} 1' file > new &&
mv new file
于 2012-12-17T12:59:03.013 回答
0

朴素的旧ed

ed file << END
/^[^#]/s/:.*/:$ipaddr1:$ipaddr2:$ipaddr2:$ipaddr1/
w
q
END
于 2012-12-17T13:06:13.520 回答