LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4244|回复: 30

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

[复制链接]
发表于 2003-3-17 09:19:42 | 显示全部楼层 |阅读模式
练练
发表于 2003-3-17 10:08:06 | 显示全部楼层

最简单的方法,呵呵

[root@localhost root]# tac <<EOF
> a
> b
> c
> d
> e
> EOF
e
d
c
b
a
[root@localhost root]# tac --help
Usage: tac [OPTION]... [FILE]...
Write each FILE to standard output, last line first.
With no FILE, or when FILE is -, read standard input.

  -b, --before             attach the separator before instead of after
  -r, --regex              interpret the separator as a regular expression
  -s, --separator=STRING   use STRING as the separator instead of newline
      --help               display this help and exit
      --version            output version information and exit

Report bugs to <bug-textutils@gnu.org>.
[root@localhost root]#
发表于 2003-3-17 10:19:25 | 显示全部楼层

用sed来试试吧

sed -e '1!G;h;$!d'

我记得info sed里有例子来者,可惜我的机子上example里面竟然是空的,气死我了。
发表于 2003-3-17 12:48:36 | 显示全部楼层
还是tac命令好使!
$tac filename
 楼主| 发表于 2003-3-17 13:10:12 | 显示全部楼层
啊,俺不知道这个命令,恩,回家试试~
 楼主| 发表于 2003-3-17 13:11:30 | 显示全部楼层
IDKEY兄是SED大拿啊,呵呵,小弟俺读不太明白你那条命令哦,在读ING。。。。
 楼主| 发表于 2003-3-17 13:14:17 | 显示全部楼层
TAC命令还是要变一变的好。

它标准是“最后一行”先读出,但行内字符还是正序的,我要求的是如“ABCDEFG”要读出“GFEDCBA”,嘿嘿
发表于 2003-3-17 15:29:38 | 显示全部楼层
你的要求蛮高的嘛~~~
冥思苦想ing~~~
发表于 2003-3-17 17:06:05 | 显示全部楼层

抄来一段对命令sed -e '1!G;h;$!d' 的解释

http://www-900.ibm.com/developer ... d/sed-3/index.shtml

反转解释

首先,该脚本包含三个由分号隔开的单独 sed 命令:'1!G'、'h' 和 '$!d'。现在,需要好好理解用于第一个和第三个命令的地址。如果第一个命令是 '1G',则 'G' 命令将只应用第一行。然而,还有一个 '!' 字符 -- 该 '!' 字符忽略该地址,即,'G' 命令将应用到除第一行之外的所有行。'$!d' 命令与之类似。如果命令是 '$d',则将只把 'd' 命令应用到文件中的最后一行('$' 地址是指定最后一行的简单方式)。然而,有了 '!' 之后,'$!d' 将把 'd' 命令应用到除最后一行之外的所有行。现在,我们所要理解的是这些命令本身做什么。

当对上面的文本文件执行反转脚本时,首先执行的命令是 'h'。该命令告诉 sed 将模式空间(保存正在处理的当前行的缓冲区)的内容复制到保留空间(临时缓冲区)。然后,执行 'd' 命令,该命令从模式空间中删除 "foo",以便在对这一行执行完所有命令之后不打印它。

现在,第二行。在将 "bar" 读入模式空间之后,执行 'G' 命令,该命令将保留空间的内容 ("foo\n") 附加到模式空间 ("bar\n"),使模式空间的内容为 "bar\n\foo\n"。'h' 命令将该内容放回保留空间保护起来,然后,'d' 从模式空间删除该行,以便不打印它。

对于最后的 "oni" 行,除了不删除模式空间的内容(由于 'd' 之前的 '$!')以及将模式空间的内容(三行)打印到标准输出之外,重复同样的步骤。
发表于 2003-3-17 18:01:02 | 显示全部楼层

行内倒序比较复杂,找到一种sed的方法

[xyb@localhost xyb]$ echo abcde | rev
edcba
[xyb@localhost xyb]$ echo abcde | sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
edcba
[xyb@localhost xyb]$
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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