sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
例子: echo "abcd" | sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
() 用于捕获匹配的内容(matching sub-expressions)
\1,\2 分别是第一第二个()中捕获的内容(从左到右,先出现的为\1)
& 为整个匹配部分的内容,这个例子中就是\(.\)\(.*\n\)匹配的内容,即模式空间第一个\n及之前的内容
//D 的//中省略了模式串,使用前一个/x/或s/x/y/中的模式x,本例中是\(.\)\(.*\n\)
D命令删除模式空间第一个\n及之前的内容,并开始下一次循环,注意模式空间无内容时才开始处理下一行
G 把保存空间的内容附加到模式空间中去,保存空间的默认内容是空,执行后模式空间的内容会增加一个\n
命令 模式空间
读入新的一行 abcd
/\n/!G abcd\n
s/\(.\)\(.*\n\)/&\2\1/; abcd\nbcd\na
/\(.\)\(.*\n\)/D bcd\na
/\n/!G
s/\(.\)\(.*\n\)/&\2\1/; bcd\nacd\nba
/\(.\)\(.*\n\)/D cd\nba
/\n!G
....
s/\(.\)\(.*\n\)/&\2\1/; \ndcba
/\(.\)\(.*\n\)/D D失败,
s/.// 执行s/.//去掉前面的\n后输出dcba,结束一行的处理
|