复杂的sed命令说明

时间:2018-07-24 12:40:39

标签: shell unix sed

这是做什么的?这些是什么:!b:a:trail

sed -i -e '/LIMOC_SECTION=SERVICENAME_FULSC/!b' -e ':a' \
    -e "s/^PRIMARY_IP=.*/PRIMARY_IP=${primaryip}/;t trail" \
    -e 'n;ba' -e ':trail' -e 'n;btrail' $ssocfg

1 个答案:

答案 0 :(得分:2)

重写:

if..fi

这实际上是在以# If a line does not match "LIMOC_SECTION=SERVICENAME_FULSC", jump to end # (leave untouched) /LIMOC_SECTION=SERVICENAME_FULSC/! b # Label "a" :a # Substitute everything on the right side of "=" with the contents of $primaryip s/^PRIMARY_IP=.*/PRIMARY_IP=${primaryip}/ # If there was a substitution on the current line, jump to label "trail" t trail # Print pattern space and read next line n # Jump to label "a" b a # Label "trail" :trail # Print pattern space and read next line n # Jump to label "trail" b trail 开头的行的右侧替换$primaryip,但仅在匹配PRIMARY_IP=的行之后的第一个匹配项。

这是how to replace only the first occurrence in a filereplacing only within a limited range的组合。

关于所使用的各个命令和选项:

  • -i option用于就地编辑。
  • -e options标记sed脚本的各个部分。
  • :label是sed程序中的标记,可以使用LIMOC_SECTION=SERVICENAME_FULSCb分支命令跳转到该标记。
  • b是无条件分支。如果不带标签使用,它将跳转到所有命令的末尾,即仅打印模式空间。如果与标签一起使用,它将跳转到该标签。
  • t是有条件的分支:仅在自读取最后一行或从上一个分支命令以来成功进行替换后,分支才会发生。
  • n将下一行读入图案空间并打印当前行(除非禁止自动打印;在此情况下不是这种情况)。
  • s是替换命令。

我会说命令可以简化,

t

一样。它使用从匹配的sed -i '/LIMOC_SECTION=SERVICENAME_FULSC/,$ { 1,/^PRIMARY_IP=.*/ s/^\(PRIMARY_IP=\).*/\1'"$primaryip"'/ }' "$ssocfg" 到文件末尾的行范围,并在该范围内,对与LIMOC_SECTION匹配的第一行执行替换。

相关问题