我正在尝试编辑仅包含模式的第一条未注释的行。由于有几个注释和未注释的相似行,我无法仅编辑它的第一次出现
原件:
#/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/'
答案 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