转:http://blog.csdn.net/xia7139/article/details/10282861
sed也是Unix的文本处理工具。sed是Stream Editor(流式编辑器)的缩写,它能够基于模式匹配过滤(所谓过滤就是在文件中找到符合某些条件的行)修改文本(就是对找到的符合条件的内容进行一些修改操作)。
1、sed命令格式
1.1 sed命令的基本格式
sed命令主要有三种使用形式:
- sed ‘编辑指令’ 文件1 文件2 ……:用于将处理后的结果输出
- sed -n ‘编辑指令’ 文件1 文件2 ……:用于只输出编辑指令影响的行
- sed -i ‘编辑指令’ 文件1 文件2 ……:用于直接在文本文件上修改文本内容(在物理磁盘上修改文件)
1.2 编辑指令
编辑指令主要由两部分组成:前面是逗号隔开的两个地址(或者没有逗号,只有一个地址),代表要处理文本的起始位置到结束位置;后面是要进行的操作类型。格式如下:
[起始地址[,结束地址]]操作类型
如果在一条sed命令中要用到多条编辑指令,那么各个编辑指令之间要用;隔开,也可以将多条编辑指令放在多个单引号中,但是这样的话,要在每个单引号的前面加一个-e。下面是一个简单的例子:
- $cat sed_test.txt
- 1 apple a,b,d,f
- 2 boy alsdjf,apple,kdjf
- 3 cat 163.2.201.1
- 4 dog www.google.com
- 5 eat http://blog.csdn.net/xia7139
-
- $sed -n '2,5p' sed_test.txt
- 2 boy alsdjf,apple,kdjf
- 3 cat 163.2.201.1
- 4 dog www.google.com
- 5 eat http://blog.csdn.net/xia7139
-
- $sed -n '5p' sed_test.txt
- 5 eat http://blog.csdn.net/xia7139
-
- $sed -n -e '2p' -e'5p' sed_test.txt
- 2 boy alsdjf,apple,kdjf
- 5 eat http://blog.csdn.net/xia7139
1.3 操作类型
sed常用的操作类型如下:
操作 |
作用 |
p |
打印文本行(print) |
n |
取下一行(next) |
d |
删除(delete) |
s |
字符串替换(substitude) |
a |
追加新的文本(append) |
2、例子
下面的例子都是对文提到的文件sed_test.txt的操作:
- 使用正则表达式:
- (1)输出从第一个包含kdjf的行到最后一行($代表最后一行)
- $sed -n '/kdjf/,$p' sed_test.txt
- 2 boy alsdjf,appleapple,kdjf
- 3 cat 163.2.201.1
- 4 dog www.google.com
- 5 eat http://blog.csdn.net/xia7139
- (2)输出包含单词apple的行
- (shell中单词是指一个字符串前后有空格或其它标点符号。正则表达式中用一个<>来界定一个单词,在sed中用该符号要进行转义。)
- $sed -n '/\<apple\>/p' sed_test.txt
- 1 apple a,b,d,f
-
- 删除指定行(这里没有-i,不对原文件进行操作,只是将处理后的结果输出。):
- (1)删除第2到4行
- $sed '2,4d' sed_test.txt
- 1 apple a,b,d,f
- 5 eat http://blog.csdn.net/xia7139
- (2)删除包含appleapple的行和最后一行($)
- $sed '/appleapple/d;$d' sed_test.txt
- 1 apple a,b,d,f
- 3 cat 163.2.201.1
- 4 dog www.google.com
- (3)删除不包含(!表示反选,选中不符合条件的行)apple的行(这样就只剩下了包含apple的行了)
- $sed '/apple/!d' sed_test.txt
- 1 apple a,b,d,f
- 2 boy alsdjf,appleapple,kdjf
-
- 替换指定文本:
- (1)将1-4行的apple换成AMAZON。s代表替换,g代表如果一行出现两个apple则全部替换。
- $sed '1,4s/apple/AMAZON/g' sed_test.txt
- 1 AMAZON a,b,d,f
- 2 boy alsdjf,AMAZONAMAZON,kdjf
- 3 cat 163.2.201.1
- 4 dog www.google.com
- 5 eat http://blog.csdn.net/xia7139
- (2)注释shell脚本(在行首插入#)
- $sed '1,3s/^/#/g' sed_test.txt
- #1 apple a,b,d,f
- #2 boy alsdjf,appleapple,kdjf
- #3 cat 163.2.201.1
- 4 dog www.google.com
- 5 eat http://blog.csdn.net/xia7139
- (3)删除字符串apple(如果不写起始地址和结束地址,则默认为所有行。)
- $sed 's/apple//g' sed_test.txt
- 1 a,b,d,f
- 2 boy alsdjf,,kdjf
- 3 cat 163.2.201.1
- 4 dog www.google.com
- 5 eat http://blog.csdn.net/xia7139
以上两篇文章介绍了Unix两个文本处理工具awk和sed,希望对大家有所帮助。
3、sed和正则表达式
利用正则表达式结合sed能极大地帮助我们处理文本。比如下面的例子:
- 例1:正则表达式初步使用。
- $ cat poem.txt
- The choice
- By William Butler Yeats
- The intellect of man is forced to choose
- Perfection of life ,or of the work,
- And if take the second must refuse
- A heavenly mansion ,raging in the dark.
- When all that story 's finished ,what's the news?
- In luck or out the toil has left its mark:
- That old perplexity an empty purse,
- Or the day's vanity ,the night's remorse.
- (1)用命令删掉文本行首的空格。
- $ sed 's/^\s*//g' poem.txt
- The choice
- By William Butler Yeats
- The intellect of man is forced to choose
- Perfection of life ,or of the work,
- And if take the second must refuse
- A heavenly mansion ,raging in the dark.
- When all that story 's finished ,what's the news?
- In luck or out the toil has left its mark:
- That old perplexity an empty purse,
- Or the day's vanity ,the night's remorse.
- 也可以这样(注意,这里+是要被转义的,而上面的*不用转义。):
- $ sed 's/^\s\+//g' poem.txt
- The choice
- By William Butler Yeats
- The intellect of man is forced to choose
- Perfection of life ,or of the work,
- And if take the second must refuse
- A heavenly mansion ,raging in the dark.
- When all that story 's finished ,what's the news?
- In luck or out the toil has left its mark:
- That old perplexity an empty purse,
- Or the day's vanity ,the night's remorse.
-
- (2)删掉文中所有的空格
- $ sed 's/\s*//g' poem.txt
- Thechoice
- ByWilliamButlerYeats
- Theintellectofmanisforcedtochoose
- Perfectionoflife,orofthework,
- Andiftakethesecondmustrefuse
- Aheavenlymansion,raginginthedark.
- Whenallthatstory'sfinished,what'sthenews?
- Inluckoroutthetoilhasleftitsmark:
- Thatoldperplexityanemptypurse,
- Ortheday'svanity,thenight'sremorse.
- 如下也可以达到同样的效果:
- $ sed 's/\s\+//g' poem.txt
- Thechoice
- ByWilliamButlerYeats
- Theintellectofmanisforcedtochoose
- Perfectionoflife,orofthework,
- Andiftakethesecondmustrefuse
- Aheavenlymansion,raginginthedark.
- Whenallthatstory'sfinished,what'sthenews?
- Inluckoroutthetoilhasleftitsmark:
- Thatoldperplexityanemptypurse,
- Ortheday'svanity,thenight'sremorse.
-
- 也可以使用如下命令实现相关功能:
- $ sed 's/^[[:space:]]*//g' poem.txt(删除行开头的空格)
- $ sed 's/^[ ]*//g' poem.txt(删除行开头的空格)
- $ sed 's/^ *//g' poem.txt(删除行开头的空格)
- $ sed 's/^[[:space:]]*//g' poem.txt(删除行开头的空格)
- $ sed '/^$/d' poem.txt(删除空行)
- $ sed '/^[ ]*$/d' poem.txt(删除空行和只有空格的行)
4、初步体会sed的威力
比如你有一个文件内容如下:
- test.txt:
- {'books/daglib/0015113': '<title>Scale-isometric polytopal graphs in hypercubes and Z<sub>n</sub>.</title>\n',
- 'books/daglib/0097705': '<title>Discrete total l<sub>p</sub>-norm approximation problem for the function.</title>\n',
- 'books/daglib/p/AveneauCFM11': '<title>A Framework for <i>n</i>-Dimensional Visibility Computations.</title>\n',
- 'books/daglib/p/Carter11': '<title>Using <i>Dungeons and Dragons</i> to Integrate Curricula in Classroom.</title>\n',
- 'books/daglib/p/CasolaLRV11': '<title>Access Control in Cloud-on-Grid Systems: The <i>PerfCloud</i> Case Study.</title>\n',
- 'books/daglib/p/ChunKZDMZ11': '<title>Reverse Engineer of Gene Networks with Application <i>in silico</i> Network.</title>\n',
- 'books/daglib/p/ChungK11': '<title>eQTL Mapping for Functional Classes of <i>Saccharomyces cerevisiae</i> Genes wssion.</title>\n',
- 'books/daglib/p/Goldman11': '<title>A Model for Computer Graphics Based on Algebra for \xe2\x84\x9d<sup>3</sup>.</title>\n',
- 'books/daglib/p/LiZ11': '<title>Line Geometry over \xe2\x84\x9d<sup>3, 3</sup>, and Stewart Platforms.</title>\n',
- 'books/daglib/p/Liestol11': '<title><i>Situated Simulations</i> Between Reality and Designing a Narrative Space.</title>\n'}
现在你要将其中的各行中的类似于标签之类的东西去掉,只需用一条sed命令:
- $sed -e 's/<title>//g;s/<\/title>//g' -e 's/<i>//g;s/<\/i>//g' -e 's/<sub>//g;s/<\/sub>//g' -e 's/<sup>//g;s/<\/sup>//g' test.txt
- {'books/daglib/0015113': 'Scale-isometric polytopal graphs in hypercubes and Zn.\n',
- 'books/daglib/0097705': 'Discrete total lp-norm approximation problem for the function.\n',
- 'books/daglib/p/AveneauCFM11': 'A Framework for n-Dimensional Visibility Computations.\n',
- 'books/daglib/p/Carter11': 'Using Dungeons and Dragons to Integrate Curricula in Classroom.\n',
- 'books/daglib/p/CasolaLRV11': 'Access Control in Cloud-on-Grid Systems: The PerfCloud Case Study.\n',
- 'books/daglib/p/ChunKZDMZ11': 'Reverse Engineer of Gene Networks with Application in silico Network.\n',
- 'books/daglib/p/ChungK11': 'eQTL Mapping for Functional Classes of Saccharomyces cerevisiae Genes wssion.\n',
- 'books/daglib/p/Goldman11': 'A Model for Computer Graphics Based on Algebra for \xe2\x84\x9d3.\n',
- 'books/daglib/p/LiZ11': 'Line Geometry over \xe2\x84\x9d3, 3, and Stewart Platforms.\n',
- 'books/daglib/p/Liestol11': 'Situated Simulations Between Reality and Designing a Narrative Space.\n'}
如果要在原文件中修改,只需加-i参数。
转:http://leaver.me/archives/3162.html
已经看了一段时间的Linux Shell编程了,也能完成一些基本的使用,为了加深理解,恰好看到了The Unix School的一个sed&awk教程,不是简单的命令参数堆积,而是一个相当实用的系列,因此,希望能在几天内完成翻译.翻译过程不会逐字翻译,会穿插一些注释,包括自己的一些理解和其他的一些引用,作为开篇,简单说一下sed的工作机制,对后面的理解会有很大帮助。
sed是什么:
sed是一个非交互式的流编辑器(stream editor)。所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出;而所谓流编辑器,是指sed每次只从文件(或输入)读入一行,然后对该行进行指定的处理,并将结果输出到屏幕(除非取消了屏幕输出又没有显式地使用打印命令),接着读入下一行。整个文件像流水一样被逐行处理然后逐行输出。(via Walk in Mindfields )
sed工作机制:
sed维护两个缓冲区,pattern space和hold space,命令开始执行之前都为空。
pattern space缓冲区用于临时保存每次读取的一行的内容,大部分的匹配和替换等等操作都是针对pattern space中的内容进行的,因此不会对输入文件有任何影响,而hold space则作为后备缓冲区使用,除非指定了一些特殊的命令(例如D删除命令),否则pattern space中的内容会在处理完一行之后清空,但hold space中的内容在处理完每一行时不会被删除。
也就是说pattern space相当于我们的内存,hold space相当于硬盘.处理的时候在内存里,处理过的就放回硬盘.(这是我的理解,有一点点不恰当,但是因此一些概念会比较好理解.)
具体来说,可以大致分为以下几步:
1.首先,从标准输入流读取一行,移除换行符,然后存入pattern space中
2.执行指定的命令,(每个命令都有一个可选的地址(可以是行号,也可能是一个正则表达式匹配),这个地址作为一个执行命令前的测试,指定了需要对那些行进行操作。当前行只有匹配的情况下才会执行命令。)
3.当指定所有的命令都执行完了之后,pattern space内容就被处理过了,sed默认会将pattern space中的内容打印到标准输出中,移除的换行符也会打印出来。本行操作完成。
4.然后sed会读取下一行的内容,再次执行相同的操作。直到行尾。
基本上最基础的理论就差不多了.主要是这个工作机制比较重要.后面从示例中慢慢加深理解.
Unix sed实用教程第一讲,本系列第一篇,有任何问题欢迎留言讨论。
sed 是unix中最重要的编辑器之一,注意,有之一..支持多种编辑任务,本文将实现题目的功能实例
假定我们有一额文本文件,叫做empFile,包含了员工名字和员工id,如下:
|
Hilesh,1001
Bharti,1002
Aparna,1003
Harshal,1004
Keyur,1005
|
1.如何通过sed给文件添加标题行-“Employee, EmpId”
|
$sed '1i Employee, EmpId' empFile
Employee,EmpId
Hilesh,1001
Bharti,1002
Aparna,1003
Harshal,1004
Keyur,1005
|
解释:数字1,是说只对第一行执行操作,i代表在insert(熟悉vim的同学应该知道,i会在当前字符的前面插入,a是在后面插入),因此,1i就表示在将Employee, EmpId插入到第一行之前,
然后,有了标题行的文件仅仅会输出到标准输出,源文件内容并不会改变,如果需要更新源文件,可以使用重定向输出到一个临时文件,然后移动到原始文件。如果Unix系统的sed是GUN版本的,sed会有一个-i选项,可以直接实现更新源文件,(如何查看版本,终端下输入sed –version即可看到)下面先执行,再查看文件,发现已经多了标题行了
|
$sed-i'1i Employee, EmpId'empFile
$cat empFile
Employee,EmpId
Hilesh,1001
Bharti,1002
Aparna,1003
Harshal,1004
Keyur,1005
|
2.如何在标题行之后,也就是原始第一行之前添加一行横线–“—–”
|
$sed-i'1a ---------------' empFile
$cat empFile
Employee,EmpId
---------------
Hilesh,1001
Bharti,1002
Aparna,1003
Harshal,1004
Keyur,1005
|
同1,中,1表示第一行,a表示append(附加),也就是说当读入第一行的时候在其之后添加一行,如果你使用2i作为命令也是正确的,就是指当读入第二行的时候,在其之前插入一行。
3.如何在文件尾部添加一行
|
$sed-i'$a ---------------'empFile
$cat empFile
Employee,EmpId
---------------
Hilesh,1001
Bharti,1002
Aparna,1003
Harshal,1004
Keyur,1005
---------------
|
为了在文件尾部插入一行,如果使用之前的方法就需要知道总共有多少行,而$符号则直接指明了最后一行,因此$a表示在读入最后一行的时候,在后面插入一行
4.如何在指定的记录之后插入一条新纪录
假定我们的例子文件的内容现在是:
|
Employee,EmpId
---------------
Hilesh,1001
Harshal,1004
Keyur,1005
---------------
|
如果我想在Hilesh这个员工之后插入Bharti员工的信息,我这样做:
|
$sed-i'/Hilesh/a Bharti, 1002'empFile
$cat empFile
Employee,EmpId
---------------
Hilesh,1001
Bharti,1002
Harshal,1004
Keyur,1005
---------------
|
注意看,我们这里已经不再使用数字或者其他表示行号的标识了,我们使用了一个模式(了解过正则表达式的朋友会比较熟悉,可以理解为某种规则- /Hilesh/a 这个命令表示对于每一行读入的内容,如果发现 /Hilesh/这个匹配,在该行之后插入一行,也就是说如果文件里有两行都是Hilesh员工,那么执行完上面的命令,将会附加两行内容,这里可以想想sed的工作模式,对每一行执行命令条件检测,发现匹配,就执行。
5.如何在指定记录之前插入记录呢,比如,我想在Harshal这条记录之前插入Aparna记录呢?
|
$sed-i'/Harshal/i Aparna, 1003'empFile
$cat empFile
Employee,EmpId
---------------
Hilesh,1001
Bharti,1002
Aparna,1003
Harshal,1004
Keyur,1005
---------------
|
上一节中-Unix sed实用教程第一篇–向文件中增加一行 学习了添加文件,本节讲解数据内容替换.
本节将使用sample1.txt文件作为示例,文件内容如下,都是些水果..:
|
apple
orange
banana
pappaya
|
1.向每一行的开头添加内容,这里我们添加“Fruit:”
|
$sed's/^/Fruit: /'sample1.txt
Fruit:apple
Fruit:orange
Fruit:banana
Fruit:pappaya
|
解析:s代表substitution,也就是替换,s之后是要替换/匹配的内容,斜线/用来分隔s以及要替换的原始内容还有要替换的最终内容,而’^'符号是说一个正则,用来匹配每一行的开头,匹配成功后在开头加上’Fruit:’。
2.向每一行的行尾添加内容
|
$sed's/$/ Fruit/'sample1.txt
apple Fruit
orange Fruit
banana Fruit
pappaya Fruit
|
注意,这里的$和上一节的$符号表示的意义不同,这里则是表示行尾.
3.如何替换指定的字符,这里将小写a替换成大写A
|
$sed's/a/A/'sample1.txt
Apple
orAnge
bAnana
pAppaya
|
注意,仅仅将每一行的第一个a替换了,不是所有,本例表示替换单个字符,你可以替换一个单词都是可以的.
4.如何替换行内所有的字符,用A替换a
|
$sed's/a/A/g'sample1.txt
Apple
orAnge
bAnAnA
pAppAyA
|
注意,只是加了一个g选项,g为global的简写,就是全局,全部的意思。
5.如何替换第二次出现的a?
|
$sed's/a/A/2'sample1.txt
apple
orange
banAna
pappAya
|
不使用g,而是使用数字来表示行内第几次出现的a,结果如上
6.如何替换第二次之后的所有a呢?
|
$sed's/a/A/2g'sample1.txt
apple
orange
banAnA
pappAyA
|
很好理解对吧。
7.如果只想替换第三行的a呢?
|
$sed'3s/a/A/g'sample1.txt
apple
orange
bAnAnA
pappaya
|
回想一下第一节,在执行命令之前,会判断当前address是否满足条件,3就是地址
8.想替换一个范围行内的数据呢
|
$sed'1,3s/a/A/g'sample1.txt
Apple
orAnge
bAnAnA
pappaya
|
逗号隔开,即可
9.如何替换整行呢?比如用apple is a Fruit替换apple
|
$sed's/.*/& is a Fruit/'sample1.txt
apple isaFruit
orange isaFruit
banana isaFruit
pappaya isaFruit
|
这里‘&’符号标识了模式匹配到的内容,而.*匹配了正行,.表示任意字符,*表示一个或多个,也就是匹配了整行,&因此就是整行内容,用来重命名一组文件的时候非常有用.
10.如何进行多个替换,比如用A替换a,用P替换p
|
$sed's/a/A/g; s/p/P/g'sample1.txt
APPle
orAnge
bAnAnA
PAPPAyA
|
也就是用分号分开即可。或者也可以通过-e参数来做
|
$sed-e's/a/A/g'-e's/p/P/g'sample1.txt
APPle
orAnge
bAnAnA
PAPPAyA
|
-e 选项就是当需要替换多个的时候来用的。
另外,要是替换的太多。也可以通过右斜线来分成多行
|
$sed-e's/a/A/g'\>-e's/p/P/g'sample1.txt
APPle
orAnge
bAnAnA
PAPPAyA
|
相信通过本文实例分析,平时的文件内容替换就很简单了
本文将展示如何将文件内容读入到sed输出,同时包含如何将一个文件的部分内容写入到另一文件
一.文件读取
假定有两个文件,file1和file2,内容分别如下:
|
$cat file1
1apple
1banana
1mango
|
|
$cat file2
2orange
2strawberry
|
sed有两个选项用来读写文件
|
rfilename:读取filename指定的文件内容
wfilename:将内容写入filename指定的文件
|
看例子:
1.在file1的每一行读完之后读取file2的内容
|
$sed'r file2'file1
1apple
2orange
2strawberry
1banana
2orange
2strawberry
1mango
2orange
2strawberry
|
r file2读取file2的所有内容,因此r之前没有知道那个行号或匹配,因此有了上面的输出,记住,sed的工作机制,每次读file1的一行,然后执行命令
2.如何在读取了file1的第一行之后将file2读入
|
$sed'1r file2'file1
1apple
2orange
2strawberry
1banana
1mango
|
r前面加个1就行了
3.当file1某行匹配了模式之后,读入file2
|
$sed'/banana/r file2'file1
1apple
1banana
2orange
2strawberry
1mango
|
sed逐行读入file1,然后判断该行是否匹配banana,如果匹配,就读入file2
4.当file1读取完成后读入file2,其实就是合并两个文件
|
$sed'$r file2'file1
1apple
1banana
1mango
2orange
2strawberry
|
这里只是演示一下,其实cat file1 file2就可以完成合并
二.文件写入
使用一个file1文件,内容如下:
|
$cat file1
apple
banana
mango
orange
strawberry
|
1.将file1的2-4行写入到file2
2,4w就是写2-4行的意思,那-n呢?默认情况下sed会把读入的文件处理的结果输出到标准输出,也就是终端,而为了不使用默认输出,-n就派上用场了,执行该命令终端不会有任何输出
|
$cat file2
banana
mango
orange
|
查看file2内容,发现已经写入成功了
2.从第三行开始全部写入file2
|
$sed-n'3,$w file2'file1
$cat file2
mango
orange
strawberry
|
就不多解释了
3.如果是用正则呢?
|
$sed-n'/apple/,/mango/w file2'file1
$cat file2
apple
banana
mango
|
该命令将逐行读入file1,然后判断该行是否匹配apple,如果匹配,则作为起始行,然后继续读入,判断是否匹配mango,如果是,则作为终止行,然后将中间的内容写入到file2
本文,我们将会学习如何选择性的打印(其实,这里的打印是print,也就是输出到标准输出的意思),用到的示例文件是:
|
$cat file
Gmail10
Yahoo20
Redif18
|
1.打印所有内容
|
$sed''file
Gmail10
Yahoo20
Redif18
|
一对单引号,没有任何参数即可
2.如何打印包含Gmail的那一行.(grep也可以实现这个功能)
|
$sed'/Gmail/p'file
Gmail10
Gmail10
Yahoo20
Redif18
|
在斜线里面,我们指定正则匹配模式,p的意思呢,就是print,打印的意思,也就是打印包含Gmail这一行,但是我们看到Gmail打印了两次,为什么,因为sed的默认行为是在解析完一行之后就把他输出出来,也就是对于Gmail这一行,先执行p解析,解析完成后再默认打印一次,就打印了两次,而其他的,没有命令解析,直接读入完成后输出即可。
如果得到期望的结果呢?
|
$sed-n'/Gmail/p'file
Gmail10
|
-n参数会取消sed的默认打印行为,所以就ok了
3.删除包含Gmail的那一行。(grep -v也有同样的效果)
|
$sed '/Gmail/d'file
Yahoo20
Redif18
|
d就是delete的意思,不多解释,
同样,要想删除某一指定的行
|
$sed'1d'file
Yahoo20
Redif18
|
4.打印直到模式匹配,这里我们从头一直打印到Yahoo
|
$sed '/Yahoo/q'file
Gmail10
Yahoo20
|
q就是quit的意思,这条命令就是对于前面的行都没啥可解析的,执行默认的打印即可,一到碰到Yahoo这一行,打印完成,就停止,退出,因此,就是上面的了
打印某一指定范围行
到此,我们一直在学习基于一个条件取一行或多行,现在,我们来学习打印指定范围行
使用的示例文件如下:
|
$cat file
Gmail10
Yahoo20
Redif18
Inbox15
Live 23
Hotml09
|
5.打印前三行
|
$sed-n'1,3p'file
Gmail10
Yahoo20
Redif18
|
-n先取消默认打印,然后1,3指定行范围,p表示打印,你想一下我们前面的q命令,就知道下面这个命令效果是一样的
|
$sed'3q'file
Gmail10
Yahoo20
Redif18
|
执行默认打印,到第三行的时候退出
6.通过模式指定范围,这里我打印从Yahoo到Live之间的行,包括本身
|
$sed-n'/Yahoo/,/Live/p'file
Yahoo20
Redif18
Inbox15
Live 23
|
不用多解释了
7.从指定模式到文件尾部,这里是从Redif到文件尾
|
$sed-n'/Redif/,$p'file
Redif18
Inbox15
Live 23
Hotml09
|
回忆一下$符号吧.少年
8.从开头到匹配模式
|
$sed-n'1,/Inbox/p'file
Gmail10
Yahoo20
Redif18
Inbox15
|
相信你懂的…
对于数字不需要斜线包围,对于匹配需要斜线.就这样..
前面已经学习过替换文件内容了,本文我们学习一些更频繁使用的搜索替换操作.
示例文件使用:
|
$cat file
RE01:EMP1:25:2500
RE02:EMP2:26:2650
RE03:EMP3:24:3500
RE04:EMP4:27:2900
|
1.替换每行开始的两个字母,这里用XX来替换
|
$sed's/^../XX/'file
XX01:EMP1:25:2500
XX02:EMP2:26:2650
XX03:EMP3:24:3500
XX04:EMP4:27:2900
|
s代表substitute,前面说过了,^用来匹配行开头,.表示任意一个字符,两个..就是你懂的,
其实,不要^符号也是可以的,因为默认就是从开头开始匹配,如下也可以实现
2.删除每行开头的两个字符
|
$sed's/^..//'file
01:EMP1:25:2500
02:EMP2:26:2650
03:EMP3:24:3500
04:EMP4:27:2900
|
看到没有,后两个斜线之间没有内容,也就是用空字符来替换开头的两个字符,就实现了删除
3.要是想删除每行最后的两个字符呢
|
$sed's/..$//'file
RE01:EMP1:25:25
RE02:EMP2:26:26
RE03:EMP3:24:35
RE04:EMP4:27:29
|
再次强调,$在不同的情况下表示不同的意思,这里匹配行尾,有时候也匹配文件尾部
4.向每行末尾添加内容
|
$sed's/$/.Rs/'file
RE01:EMP1:25:2500.Rs
RE02:EMP2:26:2650.Rs
RE03:EMP3:24:3500.Rs
RE04:EMP4:27:2900.Rs
|
这里,先匹配行尾,然后把”.Rs”添加到行尾
5.在每行开头添加空格
|
$sed's/^/ /'file
RE01:EMP1:25:Rs.2500
RE02:EMP2:26:Rs.2650
RE03:EMP3:24:Rs.3500
RE04:EMP4:27:Rs.2900
|
还记得前面说过的么,sed默认不影响原始文件,要是想更新原始文件,请加-i参数
|
$sed-i's/^/ /'file
$cat file
RE01:EMP1:25:Rs.2500
RE02:EMP2:26:Rs.2650
RE03:EMP3:24:Rs.3500
RE04:EMP4:27:Rs.2900
|
6.移除开始的空格
|
$sed's/^ *//'file
RE01:EMP1:25:2500
RE02:EMP2:26:2650
RE03:EMP3:24:3500
RE04:EMP4:27:2900
|
^匹配行首,然后是一个空格,然后是*,表示一个或多个空格嘛,然后替换为空字符
7.移除行首和行尾的空格
|
$sed's/^ *//; s/ *$//'file
RE01:EMP1:25:2500
RE02:EMP2:26:2650
RE03:EMP3:24:3500
RE04:EMP4:27:2900
|
不要怕,从分号处分开,就是两条命令啦,一个做行首的,一个做行尾的,前面说过的,可以使用-e参数来分开
|
sed-e's/^ *//'-e's/ *$//'file
|
8.如何在一个字符串前后添加一些其他字符呢,可以用来字符串转义
|
$sed's/.*/"&"/'file
"RE01:EMP1:25:Rs.2500"
"RE02:EMP2:26:Rs.2650"
"RE03:EMP3:24:Rs.3500"
"RE04:EMP4:27:Rs.2900"
|
前两个斜线匹配了所有字符,也就是本行,然后后面两个斜线是替换的内容,注意里面的&符号,之前也说过的,表示匹配到的字符,也就是本行了。所有就这样啦
9.移除行首和行尾的一个字符(多个你也会的啦)
|
$sed's/^.//;s/.$//'file
RE01:EMP1:25:2500
RE02:EMP2:26:2650
RE03:EMP3:24:3500
RE04:EMP4:27:2900
|
分开看看,你可以的
10.删除第一个数字之前的所有字符
|
$sed's/^[^0-9]*//'file
01:EMP1:25:2500
02:EMP2:26:2650
03:EMP3:24:3500
04:EMP4:27:2900
|
这条命令略复杂,请先回头看一下我们的示例文件,然后我们开始分析这个表达式,地一个^表示匹配行首,然后[^0-9]* 是一个典型的正则,匹配非数字的多个字符,简单说一下[0-9]表示匹配0,1,2,3,4,5,6,7,8,9任意一个字符,前面加个一个^,表示非,也就是不匹配这些数字,然后最后是一个*,表示匹配非数字的连续多个字符,有机会的话我会推荐一个正则系列,或者自己写一篇文章。这里就先这样理解吧。
那猜猜这个是干嘛的
是的,你猜对了,删除开头的所有非字母字符。
11.删除行尾的数字
|
$sed's/[0-9]*$//'file
RE01:EMP1:25:
RE02:EMP2:26:
RE03:EMP3:24:
RE04:EMP4:27:
|
看看前面的你就知道了
12.通过分隔符得到文件最后一列
|
$sed's/.*://'file
2500
2650
3500
2900
|
可能你你预想的不一样,是不是,你可能认为会是第一列被删除,其他的列都在,不对的,sed是很贪心的,当我们指定’.*:’时,他会一直向后查找,尽量匹配更多,所以,就匹配到最后一个列之前了
13.转换整行字符为小写
|
$sed's/.*/\L&/'file
re01:emp1:25:rs.2500
re02:emp2:26:rs.2650
re03:emp3:24:rs.3500
re04:emp4:27:rs.2900
|
\L是sed的一个命令,Lowercase嘛。\L之后的内容被毁转换,而&表示前面匹配道德内容,所以就实现了转换
14.转换大写
\U你懂的,Uppercase
|
$sed's/.*/\U&/'file
RE01:EMP1:25:RS.2500
RE02:EMP2:26:RS.2650
RE03:EMP3:24:RS.3500
RE04:EMP4:27:RS.2900
|
其实,删除和替换是由一些相同的,不过,这里我们单独列出来,通过25个例子穿插讲解sed删除文件的一些方法,使用的示例文件如下:
|
$cat file
Cygwin
Unix
Linux
Solaris
AIX
|
1.删除第一行
|
$sed'1d'file
Unix
Linux
Solaris
AIX
|
d就是删除,1就是指第1行,记得哦,这不会影响到源文件,一般,做删除的时候一般要加-i参数,前面说过了
2.删除指定行,这里删除第3行
|
$sed'3d'file
Cygwin
Unix
Solaris
AIX
|
3.删除最后一行
|
$sed'$d'file
Cygwin
Unix
Linux
Solaris
|
4.删除范围行,这里删除2-4行
|
$sed'2,4d'file
Cygwin
AIX
|
5.保留指定的行,这里保留2-4行
|
$sed'2,4!d'file
Unix
Linux
Solaris
|
!这个是对前面的2,4来操作,是非的意思,也就是不是2-4行的行,这样除去2-4行,其他的都删除了
6.删除第一行和最后一行
|
$sed'1d;$d'file
Unix
Linux
Solaris
|
分号隔开两个命令,你懂的,也可以删除第二行和第三行等等. ’2d;3d’
7.删除以指定字符开头的行
|
$sed'/^L/d'file
Cygwin
Unix
Solaris
AIX
|
这里就把以L开头的Linux这一行删除了
8.删除以指定字符结尾的行
|
$sed'/x$/d'file
Cygwin
Solaris
AIX
|
这里就删除了,可以看到AIX没有删除,unix区分大小写你懂的
9.忽略大小写,都删除
|
$sed'/[xX]$/d'file
Cygwin
Solaris
|
[xX]匹配x或X,所以就成功了嘛
10.删除文件中的空行
|
$sed'/^$/d'file
Cygwin
Unix
Linux
Solaris
AIX
|
^匹配开头,$匹配结果,中间啥都没有,这样就匹配了空行,但是注意哦,如果某一行全是空格,这个命令是不会删除这一行的。
11.删除空行或是仅仅包含空格的行
|
$sed'/^ *$/d'file
Cygwin
Unix
Linux
Solaris
AIX
|
如果你看我前面的文章,这个就不用我说了吧,0个或多个空格就是匹配了所有的空行了
12.删除完全是大写字母的行
|
$sed'/^[A-Z]*$/d'file
Cygwin
Unix
Linux
Solaris
|
[A-Z]就匹配了26个大写字母的任意一个
13.删除包含Unix匹配的行
|
$sed'/Unix/d'file
Cygwin
Linux
Solaris
AIX
|
14.删除不包含Unix的行
15.删除包含Unix或Linux匹配的行
|
$sed'/Unix\|Linux/d'file
Cygwin
Solaris
AIX
|
这里要说的是|,这个本来是表示or,或的意思,但是在终端下,为了防止被认为是管道,所以要用\来转义
16.删除从第一行到满足匹配的行
|
$sed'1,/Linux/d'file
Solaris
AIX
|
可以通过行号到模式,模式到行号等等组合来匹配
17.删除从Linux匹配到末尾的行
|
$sed'/Linux/,$d'file
Cygwin
Unix
|
18.如果最后一行匹配AIX就删除,否则就不删除
|
$sed'${/AIX/d;}'file
Cygwin
Unix
Linux
Solaris
|
$匹配了最后一行,也可以是行号,比如1,后面的大括号里就是条件和处理方式了,这样就在sed里实现了if条件了,再看一遍这个例子,熟悉一下这个规则
19.所处最后一行如果满足两个匹配
|
$sed'${/AIX\|HPUX/d;}'file
Cygwin
Unix
Linux
Solaris
|
20.如果1-4行满足Solaris匹配就删除
|
$sed'1,4{/Solaris/d;}'file
Cygwin
Unix
Linux
AIX
|
21.删除包含Unix匹配的行,同时删除下一行
|
$sed'/Unix/{N;d;}'file
Cygwin
Solaris
AIX
|
N命令将下一行读入pattern space,什么。你忘了,看开篇去,这个命令就删除了两行
22.删除包含Unix的下一行
|
$sed'/Unix/{N;s/\n.*//;}'file
Cygwin
Unix
Solaris
AIX
|
作者这里没有说清楚,我讲一下,N读入了下一行,然后这时候pattern space里就相当于两行并作了一行,中间有一个换行符,所以pattern space里现在就是:
然后通过s命令匹配了\nLinux,并且替换为空,就ok了哦。
23.删除包含Linux模式的行,也包含上一行
|
$sed-n'/Linux/{s/.*//;x;d;};x;p;${x;p;}'file|sed'/^$/d'
Cygwin
Solaris
AIX
|
少年,不要怕,我们一步步来
首先,要知道,为了删除某一匹配的前一行,我们需要将文件的每一行放入到hold space里,一旦发现匹配,我们就开始删除连个缓冲区的内容,其中pattern space存储了当前行,hold space 存储了前一行
而x;p;这是啥呢,这两个命令是对每一行都会执行的,x表示exchange,即是交换hold space 和pattern space中的内容,p则是print,打印pattern space中的内容,因此,每次当前行被存入hold space,然后打印出了前一行的内容
当/Linux/匹配之后,我们使用s/.//来清空当前行,也就是pattern space为空了,当前行相当于被删了,然后使用x和hold space来交换,这样,就导致hold space为空了,然后使用d来删除pattern space的内容(此时pattern space里是交换过来的前一行的内容),因此,匹配Linnx的当前行和前一行都被删除了,
然后呢${x;p;}表示如果最后一行还在hold space里,就把他换出来,打印出来。
而后面的管道之后的命令呢,是吧第一部分sed命令之后产生的空行给删掉。
再理解一下
24.仅删除匹配Linux的前一行,不删除当前行
|
$ sed-n'/Linux/{x;d;};1h;1!{x;p;};${x;p;}'file
Cygwin
Linux
Solaris
AIX
|
和23类似,当匹配到Linux的时候,hold space 存储了前一行的内容,所以我们交换一下他们,然后前一行就进入了pattern space,然后一个d,这样就把前一行删掉了。别急,还没完,这样,当前行就被留在hold space了。就无法被输出了
1h;1!{x;p;} 1h是说,如果将第1行移动到hold space,也就是1h只对第一行操作,而后面的1!{x;p;}是说对于其他的行执行x;p;命令,
25.删除匹配模式的前后两行
|
$sed-n'/Linux/{N;s/.*//;x;d;};x;p;${x;p;}'file|sed'/^$/d'
Cygwin
AIX
|
有了前面两个例子,自己试试理解一下,有问题留言讨论吧。
之前已经学习过选择性打印输出了,本文将通过10个例子全面讲解文件输出的一些方法,主打p命令
首先看一下将使用的示例文件
|
$cat file
AIX
Solaris
Unix
Linux
HPUX
|
1.打印文件首行
之前讲过了,-n取消默认的全部打印,p表示print,1就是行号了
2.输出最后一行
3.输出不匹配X的那些行
|
$sed-n'/X/!p'file
Solaris
Unix
Linux
|
也好理解,!表示非,就是说包含X匹配的不打印输出
4.输出包含u/x的那些行
|
$sed-n'/[ux]/p'file
Unix
Linux
|
正则是强大的,这样就匹配了u/x
5.输出以x/X结尾的那些行
|
$sed-n'/[xX]$/p'file
AIX
Unix
Linux
HPUX
|
这里$符号不再是匹配文件尾部,而是行尾,这是正则的规则
6.输出以A/L开头的行
|
$sed-n'/^A\|^L/p'file
AIX
Linux
|
前面也说过,^匹配了行首,A表示A匹配,然而\|则是或者的意思,为什么要加\转义,是为了避免被解析成pipe管道,后面的就不解释了
7.隔行打印
n命令是输出当前行,然后读入下一行到pattern space的意思,这句命令是这么执行的,首先读入一行,然后通过n命令输出,然后通过n命令再读一行,然后把这行删除,就出现了隔行输出的效果
8.如何两行输出,隔两行再输出
|
$sed 'n;n;N;d'file
AIX
Solaris
HPUX
|
n;n; 命令呢输出了前两行,然后读入第三行到pattern space,N命令则对如下一行并与第三行合并,然后d命令删除pattern space中的内容,于是三四行被清空,然后读入56行,继续重复。就这样。作者这里给出的例子不直观,我举个例子,我的文件内容是
|
$cat test.txt
1
2
3
4
5
6
7
8
9
|
执行上面的命令后,会输出
明白了吧
9.输出某个范围行内以X结果的那些行
|
$sed-n'/Unix/,${/X$/p;}'file
HPUX
|
这里首先制定了从/Unix/匹配开始到文件尾部的这些行,然后呢,在这些之间的行,如果以X结果,就输出。
10.输出不包括开始和结尾的那些行
|
$sed-n'/Solaris/,/HPUX/{//!p;}'file
Unix
Linux
|
这个命令就会只输出/Solaris/和/HPUX/之间的行,不包括他们两个。
这里要说一下//这个,当匹配了Solaris的时候就进入了花括号,因为这个里面没有提供任何匹配,所以就考虑最后一次匹配模式,也就是相当于是考虑Solaris这一行,他不被打印,当到了HPUX这一匹配,//又代表了HPUX匹配,这一行也不打印。
Demo完了,你懂了么。
本文作为sed使用教程的最后一篇,将比较全面的讲解如何操作csv文件,csv文件通过逗号分隔
示例文件如下:
|
cat file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
|
1.删除第一列
|
$sed's/[^,]*,//'file
25,11
31,2
21,3
45,4
12,5
|
s开启替换模式,当^符号在中括号里的时候,就是非的意思,也就是说[^,]匹配了所有不是逗号的一个字符,然后后面的星号表示0个或多个,然后是一个逗号,也就是匹配”xxxx,”替换为空
2.删除除过最后一列的其他所有
|
$sed's/.*,//'file
11
2
3
4
5
|
sed先匹配任意多个字符,然后匹配最后一个“,”这就直接把前面的都匹配完了。替换为空即可。
3.输出第一列
|
$sed's/,.*//'file
Solaris
Ubuntu
Fedora
LinuxMint
RedHat
|
好理解把,先匹配第一列之后的逗号,然后是多个字符,然后替换为空
4.删除第二列
|
$sed's/,[^,]*,/,/'file
Solaris,11
Ubuntu,2
Fedora,3
LinuxMint,4
RedHat,5
|
先匹配第一列之后的逗号,然后匹配一个或多个非逗号字符,这样就匹配了第二列的内容,然后再匹配一个逗号,我简化一下,比如该列是1,2,3,4,那么这一个匹配就是”,2,”,替换成一个逗号,就是1,3,4了
5.输出第二列
|
$sed's/[^,]*,\([^,]*\).*/\1/'file
25
31
21
45
12
|
我们可以分析前两个斜线之间的内容
两个右斜线转移了括号,所以括号不是简单的符号,而是正则里的组的意义,圆括号的作用是对字符进行分组,并保存匹配的文本。这里先匹配非逗号的多个字符,然后一个逗号,然后再匹配第二列,并且第二列的匹配用括号括起来,然后匹配其他列,然后里面用\1来引用这个括号的内容,如果前面有两个括号,就可以使用\1或\2这样,分别表示第一个括号或第二个括号的匹配
6.输出最后一列是一位数字的行
|
$sed-n'/.*,[0-9]$/p'file
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
|
.*匹配了前面的所有字符,然后,匹配了最后一个逗号,sed的贪婪原则。。然后[0-9]匹配一个数字$表示行尾.ok
7.给每一行自动添加行号
|
$sed=file|sed'N;s/\n/ /'
1Solaris,25,11
2Ubuntu,31,2
3Fedora,21,3
4LinuxMint,45,4
5RedHat,12,5
|
这个和cat -n file的效果是一样的。awk也可以很简单的做,这里使用一个=命令会在每一行之前添加一个行号,也就是是,如果执行
文件会是:
|
1
Solaris,25,11
2
Ubuntu,31,2
3
Fedora,21,3
4
LinuxMint,45,4
5
RedHat,12,5
|
然后我们通过管道再执行
N表示读入并合并下一行,然后将两行之间的换行符替换为空即可了
8.如果第一列是Ubuntu,就把最后一列替换成99
|
$sed's/\(Ubuntu\)\(,.*,\).*/\1\299/'file
Solaris,25,11
Ubuntu,31,99
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
|
中间的
匹配“Ubuntu,任意个字符,任意个字符”,也就是将行分成几组,将本行替换成第一组的内容第一组的内容,第二组的内容,但最后的一列被替换成99,就这样。
9.如果第一列是RedHat就删除第二列
|
$sed's/\(RedHat,\)[^,]*\(.*\)/\1\2/'file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,,5
|
也好理解嘛。将要保留的用括号分组,然后用\1和\2分别引用第一组和第二组,然后中间的匹配就被删除了
10.在末尾插入一列
|
$sed's/.*/&,A/'file
Solaris,25,11,A
Ubuntu,31,2,A
Fedora,21,3,A
LinuxMint,45,4,A
RedHat,12,5,A
|
正则首先匹配了整行字符,然后使用&来引用该匹配,然后添加了一个逗号和一个A
11.在头部添加一列
|
$sed's/.*/A,&/'file
A,Solaris,25,11
A,Ubuntu,31,2
A,Fedora,21,3
A,LinuxMint,45,4
A,RedHat,12,5
|
很简单不是么…
比预计的要快,两天翻译完了.体会到了理解原理对学习sed的好处,希望对想学的人有帮助.
相关推荐
通过上述内容,我们可以看到sed和awk在文本处理方面的强大功能。sed主要用于简单的文本替换、删除等操作,而awk则更适合于数据处理和分析。掌握这些基本用法能够极大地提高在Linux/Unix环境下对文本文件的操作效率。...
8. **awk/sed**:这两种工具常用于Linux和Unix环境中,通过正则表达式处理文本流,进行文本的格式化、替换、筛选等操作,是系统管理员和脚本编写者的利器。 9. **Perl**:虽然Perl主要被用作编程语言,但其在文本...
在这个“unix学习资源__sed、awk”压缩包中,我们聚焦于两个非常重要的文本处理工具:sed和awk。这两个工具在Unix/Linux环境中对于数据处理和自动化任务至关重要。 **sed(Stream Editor)** 是一个流编辑器,它...
《类Unix系统优秀文本处理工具Awk详细介绍》 在类Unix操作系统中,Awk是一种强大的文本分析工具,常被用于处理和分析结构化的文本数据。Awk的名字来源于其三位创造者——Alfred V. Aho、Peter J. Weinberger和Brian...
《Unix文本处理》是1987年出版的一本经典著作,它深入探讨了在Unix操作系统环境下进行文本处理的各种技术和工具。这本书对于理解和利用Unix系统的强大文本处理能力至关重要,尤其对于那些希望提升文本操作效率、编写...
Unix操作系统提供了丰富的软件开发工具,其中包含了各种文本处理和编程辅助工具。这些工具的高效性和灵活性使得Unix成为程序员和系统管理员的首选平台。本章主要介绍的是Unix中的几个关键工具,包括sed、BACKUS系统...
在IT领域,UNIX系统以其强大的命令行工具和脚本处理能力而备受推崇,其中awk和sed是两个不可或缺的文本处理工具。这篇“实践大师:UNIX awk和sed编程篇”无疑是一份深入学习这两个工具的宝贵资源。让我们一起探索awk...
在Linux和其他Unix-like操作系统中,AWK是标准的工具之一,因其强大的数据处理能力和灵活性而备受赞誉。它允许用户通过模式匹配和动作来处理文本文件,对于数据分析、日志分析以及格式化输出等任务尤其高效。 AWK的...
总的来说,sed和awk是UNIX/Linux系统中的得力助手,它们提供了高效、灵活的文本处理能力,是任何IT专业人士都应该掌握的基本技能。通过熟练运用这两个工具,可以极大地提高处理文本数据的效率,尤其在需要自动化处理...
在Unix和Linux环境下,存在一种功能强大且高效的文本编辑工具——**流编辑器sed**。本文旨在通过一系列实例来深入探讨sed的基本用法及其高级功能,帮助读者掌握sed这一利器。 #### 二、sed简介 **sed**(stream ...
《计算机软件基础》课程中的第二章重点讲解了两种在UNIX系统中常用的文本处理工具:sed和awk。sed,全称Streamer Editor,是一个非交互式的文本流编辑器,它由Lee E. McMahon开发,主要用于对文本文件进行自动化编辑...
总之,sed和awk是UNIX/Linux环境下进行文本处理和数据操作不可或缺的工具。它们提供了灵活的命令语法和强大的功能,使得在命令行环境中处理文本数据变得高效且便捷。掌握这两个工具,对于提高在计算机软件基础层面的...
在IT领域,尤其是在Linux系统管理中,Bash Shell、awk和sed是不可或缺的工具,它们在文本处理和自动化任务执行方面发挥着重要作用。本指南将深入解析这些工具的使用实例和精解,帮助读者理解并掌握这些强大的命令行...
Unix Shell编程工具是Unix/Linux操作系统中...通过掌握这些工具,你不仅能提升在Unix/Linux环境下的工作效率,还能更好地理解和处理日常遇到的各种文本数据问题。不断练习和探索,你将成为一个熟练的Unix Shell编程者。
awk和sed是UNIX/Linux系统中强大的文本处理工具。awk用于处理结构化的数据,如CSV或TSV文件,而sed则擅长对文本流进行查找、替换和编辑。在这个场景下,我们不会直接使用它们进行图像转换,但可以编写脚本来自动化...
`sed` 是“流编辑器”(Stream Editor)的缩写,它是一种功能强大的文本处理工具,广泛应用于Linux和Unix系统中。`sed` 可以读取数据流,对输入的数据进行各种操作,如替换、删除、插入等,并将处理结果输出。在给定...
传统的Unix文本处理工具如sed、grep、AWK和Perl在处理文本时各有其特点,但bsed旨在简化这些操作,为程序员提供一种更直观、更易于理解的界面。 sed是一种流编辑器,常用于对输入流(标准输入或文件)进行模式匹配...
**Sed** (Stream Editor) 是一种在 Unix 和 Linux 系统中用于文本处理的强大工具。它允许用户通过命令行来自动化文本编辑任务,使得批量编辑文件变得更加简单高效。 ##### 1.1 何时使用 Sed - **重复编辑任务**: 当...