zsh环境使用csplit按模式拆分文件时{*}参数报错如何处理
问题原因
你遇到的报错来自两个可能的原因:
- zsh 默认开启花括号扩展,未加引号的
{*}会被zsh先解析处理,传给csplit的参数不符合预期 - 如果你使用的是macOS等BSD系系统,系统自带的BSD版本
csplit本身不支持{*}语法,该语法是GNUcsplit的扩展功能
解决方法
方法1:先对{*}加引号(适配GNU csplit环境)
给{*}也包裹单引号,阻止zsh的扩展解析,直接把参数传递给csplit:
csplit my_file '/^ABC$/' '{*}'
如果需要输出file1、file2格式的文件名,补充文件名参数即可:
# GNU csplit 可以指定起始编号为1 csplit -f file -n 1 --start-number=1 my_file '/^ABC$/' '{*}'
方法2:自动计算拆分次数(适配BSD csplit环境,无需安装额外软件)
如果加引号后仍然报错,说明你用的是不支持{*}的BSD版csplit,可以通过grep先统计匹配次数,自动计算拆分次数:
# 统计ABC的行数,拆分次数=匹配数-1 match_count=$(grep -c '^ABC$' my_file) csplit -f file -n 1 my_file '/^ABC$/' $((match_count - 1))
输出的文件会从file0开始,你可以手动重命名或者调整参数适配需求。
方法3:安装GNU版本csplit(macOS环境推荐)
macOS下可以通过homebrew安装GNU coreutils包,其中的GNU版csplit命令名为gcsplit,原生支持{*}语法:
# 安装依赖 brew install coreutils # 执行拆分 gcsplit -f file -n 1 --start-number=1 my_file '/^ABC$/' '{*}'
内容的提问来源于stack exchange,提问作者vbfh
相关产品推荐
相关产品推荐

