在我刚接触Linux的那段时间,参加了一个面试其中有一道面试题没做出来,这道题一直烙在我脑海,面试完之后我便开始认真得学了一下sed,轻松决解。
面试题内容大致如下:
用sed将 one 1 转变为 one 1
two 1 two 2
three 1 three 3
four 1 four 4
文件名:test.txt
sed “=” test.txt | sed “N;s/\n/ /;s/\(. \)\(.*\)\( *1)\/\2\1/”
执行过程:sed的"="选项为显示行号:
sed -i "=" test.txt
1 one 1 2 two 1 3 three 1 4 four 1
n 输出模式空间行,读取下一行替换当前模式空间的行,执行下一条处理命令而非第一条命令。
N 读入下一行,追加到模式空间行后面,此时模式空间有两行,并用换行符分隔。
h 把模式空间里的行拷贝到暂存空间。
H 把模式空间里的行追加到暂存空间。
g 用暂存空间的内容替换模式空间的行。
G 把暂存空间的内容追加到模式空间的行后。
x 将暂存空间的内容于模式空间里的当前行互换。
sed -i "N;s/\n/ /;s/\(. \)\(.*\)\(1)\/\2\1/" test.txt
N:
模式空间:
1\none 1 2\ntwo 1 3\nthree 1 4\nfour 1
s/\n/ /:
1 one 1 2 two 1 3 three 1 4 four 1
s/\(. \)\(.*\)\(1\)/\2\1/:
one 1 two 2 three 3 four 4