LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: big_awaya

练习:如何把一个文件倒着读出来?

[复制链接]
发表于 2004-5-20 13:08:31 | 显示全部楼层
echo abcde | sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

大侠,能不能帮助解释一下这一句? 我看了半天有点糊涂。
谢谢!
发表于 2004-5-20 14:09:10 | 显示全部楼层

我想你看不懂是因为这个sed命令用了一个缩写.

这个命令其实是这个样子的:

echo abcde | sed -e '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;/\(.\)\(.*\n\)/D;s/.//'

它用来把字符串倒续.

PS:
怎么让发的帖子保持原来的缩进?thx!
发表于 2004-8-19 10:08:48 | 显示全部楼层
哪位,能够解释这条语句:


[PHP]sed -e '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;/\(.\)\(.*\n\)/D;s/.//'[/PHP]

谢谢!
发表于 2004-8-19 11:27:07 | 显示全部楼层
哦,原来这么简单
发表于 2004-8-19 11:30:55 | 显示全部楼层
sorry,发错了,上一句是给dearvoid的

今天的论坛有点问题,按编辑键出来的是删除
发表于 2004-8-19 11:31:19 | 显示全部楼层
doubleelec兄,可否解释下?
发表于 2004-8-19 13:41:38 | 显示全部楼层
我刚才那一句不是指这个脚本简单,不过我还是硬着头皮解释一下
  1. echo abcde | sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
复制代码

这里包括4条sed命令:

(1)/\n/!G   如果模式空间没有换行符就在后面加一个换行符(本来是加保持空间的内容,但保持空间是空的)

(2)s/\(.\)\(.*\n\)/&\2\1/   将被匹配的内容(即模式空间的第一个非空行)换成以下三部分:被匹配部分,被匹配部分除去第一个字母,第一个字母

(3)//D   使用上一次的模式即/\(.\)\(.*\n\)/,如果匹配则删去模式空间第一行并返回第一条命令继续执行

(4)s/.//   删去模式空间第一个字符

然后,来看看它是怎样工作的:
模式空间内容是:abcde

第一轮:
经过(1):abcde\n
经过(2):abcde\nbcde\na
经过(3):bcde\na    然后反回到(1)

第二论:
经过(1):因为有\n所以不执行
经过(2):bcde\ncde\nba
经过(3):cde\nba  然后反回到(1)

注意这时ba已经反过来了,以此类推,
最后一轮经过(3):\nedcba  这时不能匹配/\(.\)\(.*\n\)/了,也不用返回(1)了
经过(4):edcba

请批评指正
发表于 2004-8-19 14:40:54 | 显示全部楼层
呵呵~~~~,谢谢doubleelec兄,原来'D'是带条件循环,这样的话,
就好理解了,嘿,我对'D'这个命令不熟悉。
谢谢!
发表于 2004-8-19 17:03:39 | 显示全部楼层
D的主要功能是删除模式空间第一行(到\n为止),但这个脚本中这么写主要是利用其循环的功能
发表于 2004-11-20 01:15:30 | 显示全部楼层
最初由 dearvoid 发表
$ tac /your/file | rev


linux 里各种怪怪的小命令还真多, hehe.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表