我已经制定了在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”字符串。但它不仅会取代那个,而且会取代所有后续。
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)
' -e '与多行脚本(也是一个新的生产线"和替换周围'的"变量解释)NEW_VVERafter的第一次出现,#NOTE但不在同一行(假设 # note 是注释行)。Linne 可能排在第 50 位#NOTENEW_VVER和CURRENT_VER是正则表达式兼容(逃逸元字符一样&)