这是做什么的?这些是什么:!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
答案 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 file和replacing only within a limited range的组合。
关于所使用的各个命令和选项:
-i
option用于就地编辑。-e
options标记sed脚本的各个部分。:label
是sed程序中的标记,可以使用LIMOC_SECTION=SERVICENAME_FULSC
或b
分支命令跳转到该标记。b
是无条件分支。如果不带标签使用,它将跳转到所有命令的末尾,即仅打印模式空间。如果与标签一起使用,它将跳转到该标签。t
是有条件的分支:仅在自读取最后一行或从上一个分支命令以来成功进行替换后,分支才会发生。n
将下一行读入图案空间并打印当前行(除非禁止自动打印;在此情况下不是这种情况)。s
是替换命令。我会说命令可以简化,
t
一样。它使用从匹配的sed -i '/LIMOC_SECTION=SERVICENAME_FULSC/,$ {
1,/^PRIMARY_IP=.*/ s/^\(PRIMARY_IP=\).*/\1'"$primaryip"'/
}' "$ssocfg"
到文件末尾的行范围,并在该范围内,对与LIMOC_SECTION
匹配的第一行执行替换。