Chinaunix首页 | 论坛 | 博客
  • 博客访问: 530594
  • 博文数量: 230
  • 博客积分: 5726
  • 博客等级: 大校
  • 技术积分: 2765
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-21 13:51
文章分类

全部博文(230)

文章存档

2011年(33)

2010年(40)

2009年(157)

分类: LINUX

2009-04-21 17:14:42

用sed、tr、col对文本进行处理
利用sed向源代码中增加注释,test.sh源代码内容:
$ cat test.sh
#!/bin/sh
#Just for test by ELM
#

elm-start
ls
elm-end

echo "all done"
使用sed命令来注释elm-start和elm-end之间的内容:
$ sed -i '/elm-start/,/elm-end/s/^/#/' test.sh; cat test.sh
#!/bin/sh
#Just for test by ELM
#

#elm-start
#ls
#elm-end

echo "all done"
命令大概意思:将标志elm-start elm-end之间的代码开头替换成#。

删除注释:
由于elm-start和elm-end属于非shell命令,所以不去掉前面的注释:
$ sed -i '/elm-start/,/elm-end/{/^#elm-/!s/^#//;}' test.sh; cat test.sh
#!/bin/sh
#Just for test by ELM
#

#elm-start
ls
#elm-end

echo "all done"
注意,如果在tcsh下使用:
% sed '/elm-start/,/elm-end/{/^#elm-/\!s/^#//;}' test.sh

$ sed -n '/^ls/p;p' test.sh
#!/bin/sh
#Just for test by ELM
#

#elm-start
ls
ls
#elm-end

echo "all done"
命令把以ls开头的行输出2次,由于使用了p;p,由于第二个p不受/^ls/所在范围限制,所以对于所有输入的行都起作用。如果只想输出以ls开头的行可以使用如下命令:
$ sed -n '/^ls/p;/^ls/p' test.sh
ls
ls
或使用:
$ sed -n '/^ls/{p;p;}' test.sh
{...}结构包含了一个功能列表,指明在处理指定范围内的文本行时所要完成的操作。

使用交换保持空间表示文本:
sed将输入读取到模板空间中,但是它还提供一块缓冲(称为交换保持空间)以及对应的函数,可以将文本从一个地方移动到其他地方。其他所有的操作(诸如s和d)都是针对模板空间进行的,而不是交换保持空间。

观察以下的sed脚本:
$cat case.script
# Sed script for case insensitive search
#
# copy pattern space to hold space to preserve it
h
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
# use a regular expression address to search for lines containing:
/test/ {
i\
vvv
a\
^^^
}
# restore the original pattern sace from the hold space
x;p
首先,我们将上述脚本写入一个文件中,而不是直接敲在命令行里。以“#”开头的行都是注释,在执行时是被忽略的。其它的行都是代表了一个sed的命令,命令之间用回车或者“;”分割。sed每次读取输入中的一行,对其执行全部的脚本。以下的操作就是在sed读取了一行文本之后要执行的:

h
将模板空间(当前读入的文本行)复制到交换空间中。

y/ABC/abc/
在模板空间执行,将大写字母替换成小写字母。

/test/ {....}
检查当前行,如果其中含有字符“test”,就视为匹配(忽略大小写,因为此时文本已经被全部被转成消协格式),随后执行功能列表中对应的操作。这个例子是用来将a\后i\前的文本进行高亮显示的。

x
交换模板空间和保持空间,恢复模板空间中的原始文本内容。

p
打印模板空间中的内容。

如下是测试内容:

$ cat case
heihei  test
fdasf   fdaa
fdadfdfa
fdfafa
fdaf    Test
fdadfa
end

$ sed -n -f case.script case
vvv
heihei  test
^^^
fdasf   fdaa
fdadfdfa
fdfafa
vvv
fdaf    Test
^^^
fdadfa
end

转换大小写

$ echo AbC | tr 'ABC' 'abc'
abc

转换字符

$ tr \\r \\n < soure > result
source是源文件,result是新文件,将source中的回车符替换成了换行符。

删除双重换行

$ tr -s \\n < lines > tmp ; mv tmp lines

删除字符:

$ tr -d test < file

将制表符(tab)替换为空格(space)

如果希望将制表符替换为多个空格符,可以使用-x选项:

$ cat tabs
aa      bb      cc
$ od -x tabs
0000000 6161 6209 0962 6363 000a
0000011

$ col -x < tabs > spaces

$ cat spaces
aa      bb      cc
$ od -x spaces
0000000 6161 2020 2020 2020 6262 2020 2020 2020
0000020 6363 000a
0000023
阅读(702) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~