Linux sed 命令详解系列教程之各种问题解决(3)

无论是sed自动读取下一行,还是"n"或"N"命令读取下一行,只要有读取动作,在其前面必然会输出模式空间的内容。当"N"读取下一行时,首先���会判断是否还有下一行可供读取,如果有,则先锁住模式空间,然后自动输出并清空模式空间,再解锁模式空间并向其尾部追加一个换行符"\n",最后读取下一行追加到换行符尾部。由于模式空间被锁住,使得自动输出时输出流是空流,也同样无法清空模式空间。注意,它不是禁止输出,虽然输出空流的结果和禁止输出是一样的,但输出空流它有输出动作,有输出流,会写入标准输出,而禁止输出则没有输出动作。如果没有下一行可供读取,则自动输出模式空间、清空模式空间并退出sed程序。过程大致如下所描述:

if [ "$line" -ne "$last_line_num" ];then
    lock pattern_space;
    auto_print;
    remove_pattern_space;
    unlock pattern_space;
    append "\n" to pattern_space;
    read next_line to pattern_space;
else
    auto_print;
    remove_pattern_space;
    exit;
fi

回到"a"命令和"N"命令结合的问题上。之所以"a"命令的队列化文本会插入在匹配行的前面,问题就出在输出空流上。"N"在准备读取下一行时,它有输出动作,即使输出结果为空。而"a"命令是时刻等待sed输出流的,只要一有输出流,立马就会追上去追加在输出流的屁股后面。因此,"matched successful"会追加在空流的尾部,追加之后"N"才会读入下一行,最后输出模式空间中的内容"ccc\nddd",也就得到前面"有悖期待"的结果。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/12892.html