sed '/a/{x;p;x}' abc.txt 我这样理解对吗
cat abc.txt
a
b
c
d
-------------end----------
sed '/a/{x;p}' abc.txt
[]
[]
b
c
d
我的理解是以下这方面:
/a/匹配到执行x命令 ,由于sed的自动打印功能它会打印出
sed '/a/{x}' abc.txt
[] #匹配的行已经是空行了,如果除了x外没有其它命令,它就自动打印bcd行
b
c
d
-----------
而{}加上 p {x;p} p是打印出pattern space 的东西,而关键此时行是在[] ,pattern space
内空为空所以会在原来的[]上生加一个空行,
测试:本行先打印,再PATTERN SPACE
sed '/a/{p}' abc.txt
a
a pattern space contents
b
c
d
总结:x 后 本行会变为[] ;然后如果遇到 p ,因为当前行为[] 它会在当前行加一行 [] ;
sed '2{p;}' abc.txt
a
b
b --pattern space
c
d
sed '2{x;}' abc.txt
a
c
d
sed '2{x;p}' abc.txt x使当前行为[]
a
--pa spa
c
d
总结:两次打印的情况
如下cat file:
A
B
C
D
#END
sed '' file 此处用了sed 的默认打印功能
A
B
C
D
如果我再来个p
sed 'p' file
A
A --PATTERN
B
B --PATTERN
C
C
D
D
1。用sed命令模拟tail -40 file1
2。编写一个sed命令,给一个文件的行间距变为两倍行距
(越简洁越好,谢谢)
请教两个sed的写法
1.
#!/bin/sh
last_line=`sed -n '$=' file1`
line=`expr ${last_line} - 39`
sed -n "${line},$"p file1
2.
是不是要达到这种效果?
对于第一题我的思路是:把源文件反序排列,然后输出前40行。
sed '1!G;h;$!d' file|sed -n '1,40'p
如下cat file:
A
B
C
D
#END
A P:A h:A d
B P:(FOR G)B\nA h:B\nA d
C p:(FOR G)C\nB\nA h:C\nB\nA d
D p:(FOR G)D\nC\nB\nA h:D\nC\nB\nA not d default print
总结:G h 经常连胜来搬动数据上下行当然了,至于怎么反序排列方法很多,不过按照楼主的意思,只用sed啦! :wink:
阅读(475) | 评论(0) | 转发(0) |