如何将依赖GNU sed的Bash goto函数适配为BSD sed兼容版本?
兼容BSD sed的Bash goto函数修改方案
原代码中的sed命令依赖GNU sed的语法,BSD sed(macOS默认版本)对标签定义的语法要求更严格——标签必须作为独立命令存在,不能和其他命令用分号放在同一行。以下是修改后的兼容版本:
#!/bin/bash scriptDir="$(cd "$( dirname "$BASH_SOURCE")" && pwd)" function goto { shortcutName=$1 # 修改sed命令,适配BSD sed语法 newPosition=$(sed -n "/: $shortcutName$/{ :a n p ba }" "$scriptDir/$(basename -- "$BASH_SOURCE")") eval "$newPosition" exit } alias :="goto" # script code : somegotolabel # script code goto somegotolabel
修改说明
- 核心逻辑保持不变:找到匹配
: shortcutName的行后,从下一行开始循环打印所有内容,通过eval执行这些代码并退出当前函数。 - 关键修改点:将原sed脚本中用分号串联的命令拆分为换行结构,让标签
:a成为独立的命令行——BSD sed不允许标签定义与其他命令在同一行用分号拼接,必须单独占据一行。
你也可以用多-e参数的方式拆分命令,效果完全一致:
newPosition=$(sed -n -e "/: $shortcutName$/{:a" -e "n" -e "p" -e "ba" -e "}" "$scriptDir/$(basename -- "$BASH_SOURCE")")
内容的提问来源于stack exchange,提问作者parricc
相关产品推荐
相关产品推荐

