在包含它的第一个未注释行中编辑模式的第一个出现

时间:2012-12-17 10:33:59

标签: perl shell

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

原件:

#/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 个答案:

答案 0 :(得分:2)

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

perl -pe's/^(?!#)[^:]*:\K.*/.../ .. 0'

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

repl="ipaddr1:ipaddr2:ipaddr3:ipaddr4"
awk -v r="$repl" 'found==0 && !/^#/ {sub(/:.*/, ":" r); found=1} 1' file > new &&
mv new file

答案 3 :(得分:0)

普通老ed

ed file << END
/^[^#]/s/:.*/:$ipaddr1:$ipaddr2:$ipaddr2:$ipaddr1/
w
q
END