如何删除输入流中首个空字符及之前的所有内容?
解决方案
要实现删除输入流中首个空字符(null)及之前所有内容的需求,你可以用perl来处理,它能直接操作整个输入流(而非按行处理),完美适配你的场景:
echo $'ab012\nab012' | tr '0' '\0' | perl -0777 -ne 's/.*?\0//s; print' | od -An -t uC
命令解释:
-0777:让Perl将整个输入流作为单个字符串读取,避免按行分割处理-ne:读取输入并执行后续脚本s/.*?\0//s:用非贪婪模式匹配首个null字符及之前的所有内容,并将其替换为空;s修饰符让.匹配包括换行符在内的所有字符print:输出处理后的剩余内容
执行后你会得到预期的输出:49 50 10 97 98 0 49 50 10,对应1、2、换行符、a、b、空字符、1、2、换行符。
另外也可以用awk实现,写法稍复杂:
echo $'ab012\nab012' | tr '0' '\0' | awk -v RS='\0' 'NR>1{printf "%s%s", prev, $0} {prev=RT}' | od -An -t uC
这里通过设置记录分隔符RS为null,跳过第一个记录(首个null之前的内容),然后将后续记录连同分隔符(RT)一起输出,还原完整的流结构。
内容的提问来源于stack exchange,提问作者jagprog5
相关产品推荐
相关产品推荐

