Grep空字节问题:命令替换忽略空字节警告的解决方法
解决bash命令替换中空字节警告的正确方法
问题根源
使用grep -zoP时,-z选项会将输出的换行符替换为空字节(\0),而bash的命令替换$(...)无法处理空字节,会自动忽略并抛出警告。你之前尝试的tr命令写法错误,因为<后面只能接文件路径,不能直接接命令,导致grep把grep当成文件名找不到。
方案1:移除-z选项(推荐,若场景允许)
如果你的需求是跨行匹配从.global LIST到末尾-1的内容,可以用Perl正则的DOTALL模式((?s))让.匹配换行符,不需要依赖-z选项,这样输出不会包含空字节,自然不会触发警告:
GREP_RESULT=$(grep -oP "(?s)\.global LIST.*-1\Z" part1.s)
解释:(?s)启用DOTALL模式,.会匹配包括换行在内的所有字符,替代原命令中(.|\n)的写法,同时去掉-z避免产生空字节。
方案2:正确过滤空字节(若必须保留-z)
如果因为某些场景必须使用-z选项,需要用管道将grep的输出传给tr删除空字节,而不是错误的重定向写法:
GREP_RESULT=$(grep -zoP "\.global LIST(.|\n)*-1\Z" part1.s | tr -d '\0')
这里用|将grep的输出作为tr的输入,tr会删除所有空字节,再传给命令替换,就不会触发警告了。
验证错误原因
你之前的命令tr -d '\0' < grep -zoP "..." part1.s是错误的,因为<是输入重定向,它会尝试打开名为grep的文件读取内容,而不是执行grep命令,这才会出现grep: No such file or directory的错误。
内容的提问来源于stack exchange,提问作者vic
相关产品推荐
相关产品推荐

