sed编辑器
又被称作:流编辑器(stream editor),即 基于预先提供的一组规则来编辑数据流。
sed命令的格式如下: sed options script file
option选项:
-e script
-f file
-n :禁止 sed 编辑器输出
在命令行上定义编辑器命令
$: sed 's/dog/cat/' data1.txt # data1.txt中的dog替换成cat $: echo "This is a test" | sed 's/test/big test/'
sed编辑器并不会修改文本文件的数据。它只会将修改后的数据发送到STDOUT。源文件内容不变。
在命令行使用多个编辑器命令(-e选项)
#注意:命令末尾和分号之间不能有空格 $: sed -e 's/brown/green/; s/dog/cat/' data1.txt
从文件中读取多个编辑器命令(-f选项)
$: cat script1.sed s/brown/green/ s/fox/elephant/ $: sed -f script1.sed data1.txt
gawk程序(有待更新)
gawk程序是Unix中的原始awk程序的GNU版本。它提供了一种编程语言而不只是编辑器命令。
用途:
定义变量来保存数据;
使用算术和字符串操作符来处理数据;
使用结构化编程概念(比如if-then语句和循环)来为数据处理增加处理逻辑;
通过提取数据文件中的数据元素,将其重新排列或格式化,生成格式化报告
命令格式:
gawk options program file
sed编辑器基础
替换标记
sed 's/test/trial/' data1.txt #只会替换每行中出现的第一处
格式:
s/pattern/replacement/flags
有4种可用的替换标记(flags):
数字,表明新文本将替换第几处模式匹配的地方;
g,表明新文本将会替换所有匹配的文本;
p,会打印替换命令中指定的模式匹配的行(通常与 sed 的-n选项一起使用)
w file,将替换的结果写到文件中#满足匹配模式的行会被保存到指定的输出文件中
$: sed ‘s/test/trial/w test.txt’ data1.txt替换字符
当文本字符串中有一些不太方便在替换模式中使用的字符时(eg:正斜线(/)),可以使用字符分隔符;sed 编辑器允许选择其他字符来作为替换命令中的字符串分隔符;例如:
# 将/bin/bash 替换成 /bin/csh $: sed 's!/bin/bash!/bin/csh!' /etc/passwd #使用! $: sed 's&/bin/bash&/bin/csh&' /etc/passwd #使用&
使用地址
如果想将命令作用于某一行或某些行,必须用行寻址
可以:
1) 以数字形式表示行区间
[address]command
包含多个命令:
address {
command1
command2
command3
}# 替换第二行,第一个满足的 sed '2s/dog/cat/' data.txt # 替换第2~6行,第一个满足的 sed '2,6s/dog/cat/' data.txt # 替换第二到最后一行,第一个满足的 sed '2,$s/dog/cat/' data.txt # 多个命令 $ sed '2{ > s/fox/elephant/ > s/dog/cat/ > }' data1.txt
2) 以文本模式来过滤出行
/pattern/command
# 将用户Samantha的默认shell由bash改为csh sed '/Samantha/s/bash/csh/' /etc/passwd
删除行命令(d)
sed '3d' data.txt # 删除第三行 sed '2,5d' data.txt #删除2,3,4,5行 sed '3,$d' data.txt #删除第3到最后一行 sed '/number 1/d' data.txt #删除匹配 'number 1' 的行
插入和附加文本
1) 插入命令 i :在指定行前增加一个新行
2) 附加命令 a:在指定行后增加一个新行
echo "test line 2" | sed 'i\test line 1' sed '3a\this is an append line' data6 sed '$a\this is an append line' data6
修改行 (c)
sed '3c\this is a changed line.' data6 sed '/line 2/c\this is a change one.' data6 #文本模式来寻址
转换命令(y)
可以处理单个字符的sed编辑器命令
格式:[address]y/inchars/outchars/
转换命令会对 inchars 和 outchars值进行一对一的映射。
#将data.txt中 1替换城7,2 > 8, 3 > 9 $ sed 'y/123/789' data.txt
使用 sed 处理文件
1)写入文件格式: [addreess]w filename
$ sed '1,2w test.txt' data.txt
2)从文件读取数据
格式:[address]r filename #address可以是一个行号 or 文本模式地址
#将test.txt中的内容插入到data.txt的第三行之后 $ sed '3r test.txt' data.txt $ sed '/number 2/r data12.txt' data.txt $ sed '$r data12.txt' data.txt