使用 sed 更改匹配后的第一次出现

lei*_*gon 1 bash sed

我已经制定了在sed匹配后替换的语法,但它替换了匹配后的所有实例。有人可以告诉我我在这里做错了什么。我知道这是小事,但我似乎无法接受。

sed -e "0,/\#NOTE/!  s/$NEW_VVER/$CURRENT_VER/" FILE1 > FILE2
Run Code Online (Sandbox Code Playgroud)

我也试过

sed -e "0,/\#NOTE/!  s/$NEW_VVER/$CURRENT_VER/1" FILE1 > FILE2
Run Code Online (Sandbox Code Playgroud)

这是带有 sed 命令和要更改的数据的完整行。

sed -e "0,/\#NOTE/!  s/$NEW_VVER/$CURRENT_VER/" -e "0,/\#NOTE/!  s/$NEW_VER/$VER/" -e "0,/\#NOTE/!  s/$EVEN_LENGTH/$OLD_EVEN_LENGTH/" -e "0,/\#NOTE/!  s/$ODD_LENGTH/$OLD_ODD_LENGTH/" -e "0,/\#NOTE/!  s/$START_DIGIT/$OLD_START_DIGIT/" -e "0,/\#NOTE/!  s/$STRING/$OLD_STRING/ FILE1 > FILE2"
Run Code Online (Sandbox Code Playgroud)

基本上它应该找到字符串“#NOTE”并只替换匹配后的第一个实例。

    #CHANGE THESE EVERY VERSION
#NOTE: Don't forget to add the needed variables to the version arguments. 
   DEFAULT_VERSION = REPVVER
   EVEN_LENGTH = REPELENGTH 
   ODD_LENGTH = REPOLENGTH  
   CURR_VERSION = "REPVVER"
   START_DIGIT = REPSTARTDIGIT
###########################################
Run Code Online (Sandbox Code Playgroud)

例如,它应该找到字符串“#NOTE”并用新值替换“REPVVER”字符串。但它不仅会取代那个,而且会取代所有后续。

Ner*_*elu 6

sed -e '/#NOTE/!b' -e ':a' -e "s/$NEW_VVER/$CURRENT_VER/;t trail" -e 'n;ba' -e ':trail' -e 'n;btrail' FILE1 > FILE2
Run Code Online (Sandbox Code Playgroud)
  • POSIX兼容和oneliner(替换所有' -e '与多行脚本(也是一个新的生产线"和替换周围'"变量解释)
  • 更改NEW_VVERafter的第一次出现,#NOTE但不在同一行(假设 # note 是注释行)。Linne 可能排在第 50 位#NOTE
  • 假设的内容NEW_VVERCURRENT_VER是正则表达式兼容(逃逸元字符一样&