macOS中sed命令出现‘invalid command code ~’错误的解决咨询
适配macOS的sed步进输出命令写法
macOS自带的是BSD版本sed,和Linux系统的GNU sed语法存在差异,你用到的1~36p是GNU sed独有的步进行输出语法(表示从第1行开始,每36行输出一次),BSD sed不支持该写法,因此会抛出invalid command code ~的错误。
下面提供三种适配方案:
方案1:使用BSD sed原生语法实现
通过BSD sed的标签循环和计数逻辑模拟步进输出,命令如下:
sed -n '1{:loop;p;x;/^\(.\{35\}\)$/{x;b end};x;s/^/./;x;n;b loop};:end' filename
逻辑说明:从第1行开始,输出当前行后,通过字符计数累计跳过35行,完成后回到循环起点,实现每36行输出一次的效果。
方案2:用awk替代(更简洁跨平台)
awk的语法跨平台性更好,macOS自带awk,直接用以下命令即可实现相同需求:
awk 'NR % 36 == 1' filename
NR表示当前行号,行号对36取余等于1时输出该行,完美匹配原需求。
方案3:安装GNU sed(兼容原命令)
如果习惯使用GNU sed的语法,可以通过Homebrew安装GNU版本的sed:
brew install gnu-sed
安装完成后,使用gsed命令替代原生sed,即可直接运行原命令:
gsed -n '1~36p' filename
内容的提问来源于stack exchange,提问作者kgwkk2
相关产品推荐
相关产品推荐

