[译]Unix sed实用教程第二篇–替换文件内容

上一节中-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 is a Fruit orange is a Fruit banana is a Fruit pappaya is a Fruit 这里‘&’符号标识了模式匹配到的内容,而.*匹配了正行,.表示任意字符,*表示一个或多个,也就是匹配了整行,&因此就是整行内容,用来重命名一组文件的时候非常有用. 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 选项就是当需要替换多个的时候来用的。 ...

2013-08-09 · 1 min · bystander

[译]Unix 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的工作模式,对每一行执行命令条件检测,发现匹配,就执行。 ...

2013-08-09 · 1 min · bystander

Unix sed实用教程开篇

已经看了一段时间的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会读取下一行的内容,再次执行相同的操作。直到行尾。 基本上最基础的理论就差不多了.主要是这个工作机制比较重要.后面从示例中慢慢加深理解.

2013-08-09 · 1 min · bystander

和 浅析

这两个转义字符最初学习C++的时候看到了,当时没多想,后来某一天突然想起来,回车不就是换行吗?这不是多此一举吗?今天又看到,索性查了下相关资料,整理一下,留作记录. 关于“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别。 在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。 于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行(这句的意思是把纸向上拉,然后打印头就定位到了下一行),可以想象一下,这个打印头只能在一个固定的水平线上左右移动,而不能上下移动,我们通过移动纸来完成打印下一行。 不明白的我在youtube上找到一个这种打字机的演示视频,为了方便读者观看,我提供一个下载地址。 后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。 Unix系统里,每行结尾只有"<换行>",即"\n"; Windows系统里面,每行结尾是"<换行><回车>",即"\n\r"; Mac系统里,每行结尾是"<回车>",不过mac基于unix,所以换行也应该是可以的。 一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。这个如果你在windows下使用vim也会发现这个情况 用C++来说明 如: int main() { cout << "leaver.me" << "\r" << "bystander" ; return 0; } 最后只显示 bystander 而 leaver.me 背覆盖了 \n 是换行,系统会将其替换成回车+换行 把光标 先移到 行首 然后换到下一行 也就是 下一行的行首拉 int main() { cout << "leaver.me" << "\n" << "bystander" ; return 0; } 则 显示 leaver.me bystander 一句话,这看起来是一个历史遗留问题……

2013-04-05 · 1 min · bystander

操作系统的死锁和内存管理

这部分是最后一部分笔记。《现代操作系统》第三版的笔记就这样了。 死锁; 把需要排他性使用的对象称为资源,资源分为可抢占的和不可抢占的。可抢占资源可以从拥有它的进程中抢占而不会具有任何副作用。存储器就是可抢占的。不可抢占资源是指在不引起相关的计算失败的情况下,无法把它从占有她的进程处抢占过来。比如CD刻录机,如果一个进程开始刻盘,突然分配给CD刻录机到另一进程,就会划坏CD盘。死锁会发生在不可抢占资源中 死锁的规范定义:如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么,该进程集合就是死锁的。 死锁的四个必要条件 1.互斥条件。每个资源要么已经分配给一个进程,要么就是可用的。 2.占有和等待条件,已经得到了某个资源的进程可以再请求新的资源。 3.不可抢占条件,已经分配给一个进程的资源不可强制性的被抢占,他只能由占有她的进程显式的释放。 4.环路等待条件。死锁发生时,系统中一定有友两个/多个进程组成的一条回路,该环路中的每个进程都在等待着下一个进程所占有的资源。 死锁处理的四种策略 1.忽略该问题,如果可以忽略。则忽略 2.检测死锁并恢复,让死锁发生,检测他们是否发生,一旦发生。采取行动。 3.仔细对资源进行分配。动态的避免死锁。 4.通过破坏引起的四个必要条件之一。防止死锁发生。 银行家算法就是对每个请求进行检查。检查如果满足这一请求是否会达到安全状态,或是,那么满足这请求,若否。就推迟这一请求的满足。为了看状态是否安全。类似于银行家投资。看自己是否有足够的资源满足客户。如果可以。就认为投资是可以收回的。接着检查最接近最大限额的一个客户。如果所有投资最终都被收回。则该状态安全。 通信死锁:两个/以上的进程发送消息通信。A向B发送请求信息,然后阻塞直到B回复。假设请求信息丢失,A将阻塞等待回复。B则阻塞等待一个向其发送命令的请求。则发生死锁。他不能通过对资源排序/安排调度来避免,因此。采用了超时来中断通信死锁。 活锁:两个进程A和B,A获得1.B获得2.轮询请求对方的。没有进程被阻塞。看起来像是死锁发生了。就叫做活锁。 内存管理 每个linux进程都有一个地址空间,逻辑上有三段组成:代码。数据和堆栈段。代码段包含了形成程序可执行代码的机器指令。通常是只读的。是由编译器把源码转换成机器码形成的。 数据段包含了所有程序变量。字符串。数字和其他数据的存储。由两部分,初始化数据和未初始化数据。后者即为BSS,符号起始块。加载后被初始化为0.数据段可以修改。可以增加数据段的大小。 第三段是栈段。大多数机器里。从虚拟地址空间的顶部/附近开始。并且向下生长。 linux内存由三部分组成。前两部分是内核和内存映射,被钉在内存中。页面从不换粗。内存的其他部分,被划分为页框。每个页框都可以包含一个代码。数据或栈页面。 window如何知道系统配置的细节呢。答案就是windows会挂载一种特殊的文件系统,其为小文件做了优化,到名字空间,也就是注册表。注册表被阻止成了不同的卷,称作储巢。hive。一个叫做system的储巢会在系统启动时。装入内存。这里面包含了驱动什么设备工作。什么软件要初始化。那些变量等等。

2013-02-02 · 1 min · bystander

ubuntu终端su认证失败解决

 这个以前碰到过。不过今天又遇到了。记录一下。Ubuntu 安装后,root用户默认被锁定,不允许登录,也不允许“su”到 root。对于开发人员来说貌似有些麻烦了。。 解决方法:打开终端。输入sudo passwd 回车,然后输入安装ubuntu时设置的密码。回车后要求输入新密码。新密码可以和安装时的密码相同。所以继续输吧。然后确认一次。就可以了 然后正常su root 就可以切换到root了

2012-04-15 · 1 min · bystander

lamp开发环境简单搭建

 因为一些事情,要去学习php开发。所以呢。今天就先搭建一下php开发环境,其实windows下搭建相对比较简单,也有一键安装包。比如AppServ,但是因为考虑到以后的一些事情,于是还是采用LAMP开发环境。 我是用Ubuntu来做,本地刚好有Ubuntu的镜像。。虚拟里面来测试。首先就是在虚拟机里安装Ubuntu。这个不多说。大家都会。安装好以后。登陆进来。命令行或是图形界面都可以。 新版本的Ubuntu貌似是没了新立得管理器。所以使用命令来安装更简单。打开终端。切换到root。如果不能切换到root。参考此文。切换到root后。输入 apt-get install apache2 mysql-server mysql-client php5 php5-gd php5-mysql 回车后就开始自动下载了。大概几分钟后就会出现MySql的安装设置界面 输入你想设置的mysql的登录密码。然后需要再输入一遍 ok。等会就安装完成了。。就这么简单。。 然后进行一些后续的设置 默认网站的目录在/usr/www.这个目录的权限如下图。 为了以后方便。设置为777会更好一些。。执行如下命令: sudo chmod 777 /var/www 然后是启用 apache的 mod_rewrite 模块 输入如下命令: sudo a2enmod rewrite 然后继续输入如下命令来重启 Apache服务器: sudo /etc/init.d/apache2 restart Apache重启后我们可以测试一下,在 /var/www目录下新建文件 test.php,写入代码: <?php phpinfo(); ?> 保存,在地址栏输入 http://127.0.0.1/test.php 或 http://localhost/test.php ,如果正确出现了如下 php 配置信息则表明 LAMP Apache已经正常工作了 还可以测试一下mysql是否正常。这个直接在终端下输入 mysql -u root -p 然后根据提示输入密码就出现如下的图 表示已经登录到mysql了。说明mysql可以了。可以继续输入 show databases;来显示所有的数据库。 参考文章:http://blog.csdn.net/xiaojianpitt/article/details/6326834

2012-04-15 · 1 min · bystander