用sed、tr、col对文本进行处理
时间:2008-04-08 来源:wenzk
利用sed向源代码中增加注释,test.sh源代码内容:
$ cat test.sh
使用sed命令来注释elm-start和elm-end之间的内容:
$ sed -i '/elm-start/,/elm-end/s/^/#/' test.sh; cat test.sh
命令大概意思:将标志elm-start elm-end之间的代码开头替换成#。
删除注释:
由于elm-start和elm-end属于非shell命令,所以不去掉前面的注释:
$ sed -i '/elm-start/,/elm-end/{/^#elm-/!s/^#//;}' test.sh; cat test.sh
注意,如果在tcsh下使用:
% sed '/elm-start/,/elm-end/{/^#elm-/\!s/^#//;}' test.sh
$ sed -n '/^ls/p;p' test.sh
命令把以ls开头的行输出2次,由于使用了p;p,由于第二个p不受/^ls/所在范围限制,所以对于所有输入的行都起作用。如果只想输出以ls开头的行可以使用如下命令:
$ sed -n '/^ls/p;/^ls/p' test.sh
或使用:
$ 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
$ cat test.sh
#!/bin/sh #Just for test by ELM # elm-start ls elm-end echo "all done" |
$ 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属于非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" |
% 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" |
$ 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
相关阅读 更多 +