GNU sed中`sed "l" file`命令功能与输出异常问题咨询
问题1:「视觉上无歧义」的具体含义
l是sed专门为查看原始字符设计的命令,「视觉上无歧义」的核心是让所有字符(包括不可见字符、空白字符)都可被明确识别,不存在视觉上的混淆可能,具体实现特性如下:
- 所有不可打印的控制字符会转为可识别的转义序列输出,比如制表符显示为
\t、退格符显示为\b,不会直接输出原始控制字符导致排版错乱 - 行尾会固定追加
$标记,可直观区分行尾的空白字符(比如行尾空格、隐形换行)和终端的自动换行 - 超出默认长度的长行会自动折行,折行位置末尾追加
\标记,明确表示当前行是上一行的续行,不会和原始文件内的换行混淆
问题2:不符合预期的输出现象原因
你观察到的两个现象都属于sed的正常逻辑,不是异常:
内容重复输出
sed的默认工作逻辑为:每完成一行的处理后,会自动将模式空间内的原始行内容输出到标准输出。你单独执行sed "l" file时,l命令会先输出一次无歧义格式的转义内容,之后sed的默认输出逻辑又会把原始行再输出一次,就出现了两次内容。
如果只需要输出无歧义格式的内容,添加-n参数关闭sed的默认自动打印即可,命令为:
sed -n "l" file
69字节自动折行
这是POSIX标准对l命令的强制要求:l命令默认的折行长度为70字符,你看到的每行69字节内容+末尾的续行标记\刚好凑满70字符,所以长于该长度的行会被自动截断折行。
如果要取消自动折行,输出完整的单行无歧义内容,可指定折行长度为0(GNU sed 4.2及以上版本支持),命令为:
sed -n "l 0" file
内容的提问来源于stack exchange,提问作者Itération 122442
相关产品推荐
相关产品推荐

