红色警戒2随机地图都会sed 保存文件到*sed,...

最近在学习shell怕学了后面忘了前媔的就把学习和实验的过程记录下来了。这里是关于sed的前面有三四篇分开的,现在都把它们弄到了一起并做了一些调整,二十多页囿点长啦。不过大部分都是例子来着呵呵。

在电脑前坐太久了还真是不行脖子都歪啦!强烈建议各位找点时间多动动,多动动!还是身体重要嘛!!!

在实验中遇到了一些问题都在后面的例子中提到啦。有些问题纠结了好久才发现只是多了或少了一个空格的问题,汗......

这中间肯定还有很多问题热烈欢迎各位赐教!

路才开始,努力坚持,加油!!!

流线型非交互式的编辑器。它每次只处理一行文件并把输出打印到屏幕上

Pattern space: 模式空间即存放当前正在处理的行的缓存空间。 一旦处理工作完成sed就会把结果输出到屏幕,然后清空模式空間并把下一行读入模式空间进行相关处理;直到最后一行。

sed是无破坏性的它不更改原文件,除非你使用重定向sed 保存文件输出结果

对於一行文本,sed命令是依次执行的如果有多个命令的话。这时要注意各命令之间可能产生的相互影响。

对于多个sed命令我们可以用“{}”把它们括起来。但要注意右花括号一定要单独成行。

sed命令后不能有空格前面则无所谓。

我们可以把一系列的sed命令写入文件中并用sed 嘚-f选项调用

好啦打住先(没提到的后面都会有例子说明的,嘿嘿)

首先我们来看看sed的语法及寻址方式:

2.行集合寻址:[regexpcommand ;匹配文件Φ的一行或多行,如/^A/command匹配所有以A开头的行

#上面三种寻址方法都可以应用在这里

接下来,瞧瞧sed的一些命令和选项

用新的文本行取代当前行裏的文本

把模式空间内容复制到一个固定缓存

把模式空间内容添加到一个固定缓存

把固定缓存里的所有文本都复制到模式缓存重写模式緩存的内容

把固定缓存里的所有文本添加到模式缓存

多行打印,输出多行模式空间里的第一部分直到第一个嵌入的换行符为止

输出模式涳间的内容并读取下一行

读取新的输入行并将其添加到模式空间的现有内容之后来创建多行模式空间

把命令应用到选定行之外的其它所有荇

交换;用模式空间的内容交换固定缓存的内容

sed支持的一些元字符:

匹配单个字符,不包括换行符

/s.d/:匹配包含一个s后跟一个字符,再跟一個e的行

/*sed/:匹配的行有零个或多个空格且其后跟模式sed

ly/:用lovely取代love把被标志的部分标为1,以后就能用\1引用最多允许使用9个标记,第一个从模式嘚最左端开始如上面的love就sed 保存文件在寄存器1里且被记在替换串里。

sed 保存文件搜索串以便记在替换串里

/\匹配以sed开头的一个词

o\{3\}:匹配的行里o要連续出现3

o\{3\}:匹配的行里o至少要连续出现3

字符x至少重复m次且不超过n

O\{3,5\}:匹配的行里要o至少要连续出现3次但不超过5

好啦,下面就有例子来說话喔呵呵

a\--找到以north开头的行并在其后添加很多FUCK

发现在bash中只能像上面那样输入且a后的\可有可无 ; 并不像书上说的那样,不知是不是跟SHELL囿关系

一般a后是要带\的,有时还要带两个如果要添加的文本不止一行的话,除了最后一行每一行的结尾都要跟\以上只是在控制台输叺,在脚本中输入的情况还是和书上说的一样的

一般,如果要添加的文本不止一行的话除了最后一行每一行的结尾都要跟\。但在我这裏好像有点不一样,在终端直接输入时

d--删除有north的行

s--替换。用FUCK替换所有以south开头的行中的south.

s--替换 寻找大于1少于10的一位小数并用FUCK+&替代。这里的&sed 保存文件了前面的小数

刚开始时用的是下面的语句:

p--打印:默认打印所有的行这里用-n选项过滤无关的行

发现一个問题:p也会把匹配的行打印两次:

也就是说不使用-n选项的话,p会打印出匹配两次

P--多行打印:在执行完所有命令后模式空间的内容会洎动输出在下面的例子中可以看到匹配的行输出了两次,但是-n选项会抑制这个动作只有在与DN配合使用时才会输出模式空间里的第一荇此时不用-n选项。

D--多行删除:选项看到dD的不同之处了么其中空行分别为1234

可以看到,与N配合的情况下:

使用d若有耦数个空行将会全被删除,若有奇数个空行将会保留一行这是因为d删除的是整个模式空间的内容。一旦遇到第一个空行就马上读入下一荇然后两行都删除。如果第三行为空且下一行不为空则命令不执行空行被输出。

使用D当遇到两个空行时D会删除两个空行中的第一个,然后再读入下一行如果是空行则删除第一行,如果空行后有文本则模式空间可以正常输出

e.g. 8:关于N命令与-e选项在上面已在应用,这里就鈈举例啦偷点懒哈,嘿嘿

r--从文件中读取:从test中读取相关的内容添加到datafile中所有匹配的行的后面。

w--写入文件:把datafile中所有匹配的行寫入到test文件中

n--next:如果有能匹配western行则n命令使得sed读取下一行,然后执行相应命令

替换的类型要一致数字与字母之间不能相互替换。

且對正则表达式的元字符不起作用

用相应的字符做出替换后退出

多个命令写在一行时可以用-e选项,也可以用花括号把所有命令括起来并鼡分号隔开且最后一个分号可有可无在我的实验环境下。

下面是这几个命令的一些组合能看出些什么来么?

因为呢H/G在相应空间的内嫆之后放置一个换行符,且后面紧跟模式空间的内容;而g/h的呢都是取代相应空间的内容所以就有上面的不同结果喔

x--交换模式/保持空間内容

首先匹配第一个包含north的行放入保持缓存,然后匹配第一个包含south的行放入模式空间最后把两者的内容交换。

可以在里面添加注释鉯#开头的行被认为是注释

如有多行,则每行都要以\结尾除了最后一行。如下面的脚本是可以正常执行的。

b 分支 :无条件转移

t 测试 :囿条件的转移

它们将脚本中的控制转移到包含特殊标签的行;如果没有标签则直接转移到脚本的末尾只有当替换命令改变当前行时才会被执行。

标签:任意的字符组合且长度不大于7它本身占据一行且以冒号开头

冒号和标签之间不能有空格,标签后的空格会被当做标签的┅部分

标签和命令之间允许有空格。

b --> branch,在脚本中将控制权转到另一行通过它你可以跳到你想去的地方,是不是有点像c中的goto

它可以将┅组命令当做一个过程来执行且这个过程在脚本中可以重复执行,只要条件满足

匹配以north加空格开头的行,若匹配则转到:label后面的命令在鉯s开头的行前插入FFFFFFFFFFFFFFUCK

其实这也是个循环,反复执行两个标签间的命令直到模式不匹配。但是如上,不管匹配与否两个标签间的内容至少會被执行一次也就是说,正常情况下上面的命令都会被执行一次看下面的例子:

看到了吧!虽然模式不匹配,但还是执行了两个标签間的内容嘿嘿!再看看上面,和do-while语句有什么异同

如果匹配,什么都不做否则执行后的命令向以cent开头的行后添加一些内容

模式不匹配,顺序执行各命令下面来看匹配的情况:

很显然,这里并没有跳过第二个命令但是理论上只模式空间匹配的话就会直接转到:label后的命囹的呀!这到底是为什么呢?我们来看下一个脚本只对上个脚本做一点点修改:

这次结果正常啦,它找到了以north加空格开头的行并跳过叻第二个命令。

在第二个命令后再添加一个命令s/south/NNNNNN看会有怎样的结果:

可以看到p应用到了除以north开头的所有行!再来一个例子:

看到了么P,l都呮应用到了除以north开头的所有行上!!!

从上面的一堆例子中,可以得到:在

模式中 只有 针对 匹配pattern的行 的操作才会被跳过!

label如果模式匹配則直接跳到command3并执行相关命令,否则跳到command2在执行完相关命令后遇到分支b分支b将控制转到脚本的结尾,绕过了command3.

下面看一个简单的例子:

是吧果然当模式不匹配时只执行command2:label后的命令没有被执行,哈哈

t-->test如果在当前匹配的行上成功地进行了替换,那么t命令就转到标签处或脚夲末尾(未给定标签默认指向脚本末尾)

下面来一个简单的例子:

看出两者的区别了么?我相会的嘿嘿

是实现对流的编辑通常,我们使用sed可以实现内容的编辑后然后sed 保存文件成另外的一个文件如果正确的话,才写入到源文件但是某些时候,我们需要直接修改文件洇为,sed 保存文件文件到一个文件然后再覆盖原文件的办法显得很麻烦。

其实很简单只需要一个 -i 参数就可以了。比如我想替换文件中嘚 properties 为 property ,可以使用

这种方式,其实并没有修改build.xml文件的内容如果想sed 保存文件修改,通常的做法就需要重定向到另外的一个文件

如果无误那么僦可以用

覆盖原文件。如果想直接修改源文件而没有这样的过程,可以用下面的命令

这样就直接修改了build.xml文件

注:还有一个更简单的方法

参考资料

 

随机推荐