扩展正则表达式"."未匹配全部内容?sed处理文件头异常求助
问题分析与解决方案
先拆解你遇到的两个核心问题:为什么sed正则匹配不到FIELD1前的内容,以及如何正确清理出目标文件头格式。
一、原sed命令失效的原因
你的正则逻辑看似没问题,但实际不生效有两个关键诱因:
- 文件内容的本质问题:你看到的
PFcount_01032019.txt0000777017777601777760116201541013436157760015052 0ustar nfsnobodynfsnobody是tar归档文件的文件头元数据——这说明原始文件大概率是tar包的一部分,或是被错误混入了tar的二进制头信息。这些内容遵循tar的固定块结构(比如512字节块),可能跨多行存在,而你的sed命令仅处理第1行,自然找不到FIELD1的位置。 - sed对二进制字符的处理限制:POSIX标准下的sed,
.匹配的是除换行符外的单字节文本字符,但你看到的ÿþ是UTF-16 LE的BOM(两个字节的二进制标记),还有那些▒对应的二进制字节,sed无法将它们识别为“可匹配的常规字符”,导致.+无法覆盖这些内容。
二、正确的处理步骤
步骤1:彻底清理FIELD1之前的所有内容
不管前面是tar元数据还是二进制乱码,我们直接提取从FIELD1开始的所有内容,覆盖原文件:
# grep -a强制将二进制文件当文本处理,-o只输出匹配到的部分 grep -a -o 'FIELD1.*' your_file > temp_file && mv temp_file your_file
如果FIELD1可能出现在多行,也可以用awk更灵活处理:
# 找到包含FIELD1的行后,开启输出标记,删除之前所有内容 awk '/FIELD1/{flag=1} flag' your_file > temp_file && mv temp_file your_file
步骤2:将文件头处理为FIELD1 FIELD2(保留原分隔符)
此时文件开头已经是FIELD1,用sed提取到FIELD2的部分即可:
sed -i -r '1 s/(FIELD1.+FIELD2).*/\1/' your_file
这个正则的逻辑:
(FIELD1.+FIELD2)捕获从FIELD1开始到FIELD2结束的所有内容(含两者间的原始分隔符).*匹配FIELD2之后的所有冗余内容(包括: 0x30070040)- 替换为捕获的
\1,最终得到目标格式
可选:一步到位的组合命令
如果想一次性完成清理和修改,可以用awk合并逻辑:
awk '/FIELD1/{flag=1; sub(/(FIELD1.+FIELD2).*/,"\\1")} flag' your_file > temp_file && mv temp_file your_file
这条命令在找到FIELD1的行时,直接修改该行保留目标内容,同时输出后续所有行。
验证结果
处理后执行head -n1 your_file查看,文件头应该就是你需要的FIELD1 FIELD2格式,且保留了两者间的原始分隔符。
内容的提问来源于stack exchange,提问作者jackscorrow
相关产品推荐
相关产品推荐

