Linux -- sed命令(1)

一、sed编辑器简介
sed编辑器被称作流编辑器(stream editor),和普通的交互式文本编辑器恰好相反。在交互式文本编辑器中(比如vim),你可以用键盘命令来交互式地插入、删除或替换数据中的文本。流编辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。

sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。sed编辑器会执行下列操作:

(1) 一次从输入中读取一行数据。
(2) 根据所提供的编辑器命令匹配数据。
(3) 按照命令修改流中的数据。
(4) 将新的数据输出到 STDOUT 。
二、单行数据处理命令
在流编辑器将所有命令与一行数据匹配完毕后,它会读取下一行数据并重复这个过程。在流编辑器处理完流中的所有数据行后,它就会终止。由于命令是按顺序逐行给出的,sed编辑器只需对数据流进行一遍处理就可以完成编辑操作。这使得sed编辑器要比交互式编辑器快得多,你可以快速完成对数据的自动修改。

sed 命令的格式如下:

sed options script file
-e script
在处理输入时,将 script 中指定的命令添加到已有的命令中
-f file
在处理输入时,将 file 中指定的命令添加到已有的命令中
-n
不产生命令输出,使用 print 命令来完成输出
1 s替换命令
1.1 s命令(substitute)
从echo命令接受数据流
$ echo “I am good” | sed ‘s/good/best/’
从文件中接受数据流
$ cat test1.txt
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
$ sed ‘s/dog/cat/’ test1.txt
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
在命令行中使用多个编辑器命令
要在 sed 命令行上执行多个命令时,只要用 -e 选项就可以了。

$ sed -e ‘s/brown/green/; s/dog/cat/’ test1.txt
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
两个命令都作用到文件中的每行数据上。命令之间必须用分号隔开,并且在命令末尾和分号之间不能有空格。

如果不想用分号,也可以用bash shell中的次提示符>来分隔命令。只要输入第一个单引号标示出sed程序脚本的起始(sed编辑器命令列表),bash会继续提示你输入更多命令,直到输入了标示结束的单引号。

$ sed -e ’

s/brown/green/
s/fox/elephant/
s/dog/cat/’ data1.txt
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
从文件中读取编辑器命令
如果有大量要处理的 sed 命令,那么将它们放进一个单独的文件中通常会更方便一些。可以在 sed 命令中用 -f 选项来指定文件。

$ cat script1.sed
s/brown/green/
s/fox/elephant/
s/dog/cat/
$ sed -f script1.sed data1.txt
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
在这种情况下,不用在每条命令后面放一个分号。sed编辑器知道每行都是一条单独的命令。
跟在命令行输入命令一样,sed编辑器会从指定文件中读取命令,并将它们应用到数据文件中的
每一行上。

$ sed -f script1.sed data1.txt
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
$
在这种情况下,不用在每条命令后面放一个分号。sed编辑器知道每行都是一条单独的命令。
跟在命令行输入命令一样,sed编辑器会从指定文件中读取命令,并将它们应用到数据文件中的
每一行上。

1.2 替换标记
替换命令在替换多行中的文本时能正常工作,但默认情况下它只替换每行中出现的第一处。要让替换命令能够替换一行中不同地方出现的文本必须使用替换标记(substitution flag)。替换标记会在替换命令字符串之后设置。

有4种可用的替换标记:

数字,表明新文本将替换第几处模式匹配的地方

把每行的第三个cat替换为dog

$ cat test2.txt
cat cat cat cat cat
cat cat cat cat cat
cat cat cat cat cat
$ sed ‘s/cat/dog/3’ test2.txt
cat cat dog cat cat
cat cat dog cat cat
cat cat dog cat cat
g ,表明新文本将会替换所有匹配的文本

把所有的cat都替换为dog

$ cat test2.txt
cat cat cat cat cat
cat cat cat cat cat
cat cat cat cat cat
$ sed ‘s/cat/dog/3’ test2.txt
dog dog dog dog dog
dog dog dog dog dog
dog dog dog dog dog
p ,表明把匹配的内容要打印出来;
在第一类替换中,可以指定sed编辑器用新文本替换第几处模式匹配的地方,通常会和 sed 的 -n 选项一起使用。
$ cat test3.txt
Line1: I am a cat
Line2: I am a dog
$ sed -n ‘s/dog/pig/p’ test3.txt
Line2: I am a pig
w file ,将替换的结果写到文件中。会产生同样的输出,但输出同时被保存文件里
$ sed ‘s/dog/cat/w test1.o.txt’ test1.txt
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
$ cat test1.o.txt
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
通过输出重定向也可以达到这个目的,但不会在终端显示。

$ sed ‘s/dog/cat/’ test1.txt > test1.o2.txt
$ cat test1.o1.txt
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
只有那些包含匹配模式的行才会保存在指定的输出文件中。

1.3 替换字符
有时你会在文本字符串中遇到一些不太方便在替换模式中使用的字符。Linux中一个常见的例子就是正斜线(/)。替换文件中的路径名会比较麻烦。比如,如果想用C shell替换/etc/passwd文件中的bash shell,必须这么做:

sed ‘s//bin/bash//bin/csh/’ /etc/passwd
由于正斜线通常用作字符串分隔符,因而如果它出现在了模式文本中的话,必须用反斜线来转义。这通常会带来一些困惑和错误。

要解决这个问题,sed编辑器允许选择其他字符来作为替换命令中的字符串分隔符:

$ sed ‘s!/bin/bash!/bin/csh!’ /etc/passwd
在这个例子中,感叹号被用作字符串分隔符,这样路径名就更容易阅读和理解了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值