sed用法之一----答网友的在工作当中的问题

缘于一位网友的问题,我做了整理放上来……

————————————————————————————————————————————

一般我喜欢帮助别人解决问题,然后让自己感觉到很有成就感;这种想法是不是有点……哈哈,我就是这样,我比较喜欢看别人的问题,然后尽努力去帮助他。所以,经常有很多的网友来问我一些问题。时间长了,问题也就多了。我觉得应该把这个东西积累下来。所以想以博客的形式放出来,一方面,自己以后忘了可以再来看看;另一方面,希望帮到更多的朋友。

紧紧是个人看法,如果有不同意见的,可以评论留言,勿喷!谢谢~

下面来说一说一位来自群里的网友的提问;

web服务器下面的一个配置文件wp-config.php,在/var/www/目录下的好几个子目录里都有,里面的内容也不尽相同,现在想要修改这些配置文件都有的一行

/**MySQLdatabasepassword*/
define('DB_PASSWORD','GgEv!&C2rsDsdfEWayAz')
;

把后面单引号里面的内容也就是DB_PASSWORD这个数据库的密码修改为指定的字符串。

是/var/www/目录下所有名称为wp-config.php的文件都要修改

好,碰到这个问题呢,身为菜鸟的我,在老师的教导下,遵循了三个基本原则;

1.首先创建测试文件;

2.其次测试数据处理;

3.真正处理文件;

好,打开准备好的虚拟机;CentOS6.4系统

[[email protected] ~]# cat /etc/redhat-release
CentOS release 6.4 (Final)

查看创建好的测试文件;

[[email protected] ~]# ls wp-config -l
-rw-r--r-- 1 root root 32 Oct  8 14:02 wp-config

创建批量复制脚本;

【我自己写的批量copy脚本,觉得不是很满意,大家如果有好的,可以送上来。嘻嘻~】

[[email protected] ~]# cat cp.sh
#!/bin/bash
#program
#       this program help you copy file to wherever you want
#history
#09/28/13       lisp    first release
#
read -p "Please input filename i will cp it to everywhere: " filename
[ "$filename" == "" ] && echo "you must input filename! " && exit 1
for i in $@
do
cp $filename $i
done

将其批量复制到多个目录下

[[email protected] ~]# sh cp.sh /var/www/html/ /var/www/ /var/www/2/
Please input filename i will cp it to everywhere: wp-config.php
[[email protected] ~]# find /var/www/ -type f -name wp-config.php
/var/www/html/wp-config.php
/var/www/2/wp-config.php
/var/www/wp-config.php

测试数据处理

查看要处理的数据;

[[email protected] ~]# nl wp-config.php
1  <?php
2  /**
3   * The base configurations of the WordPress.
4   *
……omitting……
21  /** MySQL database password */
22  define('DB_PASSWORD', 'GgEv!&C2rsDsdfEWayAz');
……omitting……

利用sed进行数据处理测试;

[[email protected] ~]# sed -n 's/\(PASSWORD....\).*\(..;\)/\1123456\2/gp' wp-config.php
define('DB_PASSWORD', '123456');

或者

[[email protected] ~]# sed -n "s/PASSWORD', '.*'/PASSWORD', '123456'/gp" wp-config.php
define('DB_PASSWORD', '123456');

在这里要和大家说的就是,使用sed一般我们都是使用hard quote来放在sg的两个肩膀上,但是如果我们要替换的内容里面有单引号(hard quote)呢?

有两种方法(目前我想到的),一种是要么避开它,一种是要么就是直接“面对”它。

第一种就是逃避的方式,我们用\(\)局部替换,将单引号悄悄的括起来了,它也就没什么话可说了。

第二种就是所谓的在外面使用双引号(softquote),那么你里面的单引号就可以畅行无阻了……。

那为什么单引号里面就不能再次使用单引号了呢?

我的理解是,sed语句执行的时候,判断开始的执行条件符号是单引号,那么在执行的过程中再次碰到的单引号它将作为结束来处理(转义根本没用),如果再次碰到单引号,那么它又会以开始来判断,所以你写完语句的时候,在写后面的数据流的源文件的时候试试Tab键,它没反应,就是因为sed还没有结束标识,所以默认现在还不是shell的命令,所以Tab是没用的。只有你写了完整的起始和结束标识符,你Tab的时候才会补全文件名。

【PS:这个也可以作为判断你的sed语句是否写的正确,如果按了半天的Tab,没有补全功能,那说明你的命令是有问题的;awk也是如此哦!】

好了,关键的一步我们搞定了以后,接下来的就小菜一碟啦!

使用find查找出我们要修改的文件

[[email protected] ~]# find /var/www/ -type f -name wp-config.php
/var/www/html/wp-config.php
/var/www/2/wp-config.php
/var/www/wp-config.php

(这其实就是我刚刚操作的命令,再执行一次,查看有哪些文件)

结合管道利用sed的数据处理功能来对找出来的文件依次修改【测试环节】

[[email protected] ~]# find /var/www/ -type f -name wp-config.php | xargs sed -n "s/PASSWORD', '.*'/PASSWORD', '123456'/gp"
define('DB_PASSWORD', '123456');
define('DB_PASSWORD', '123456');
define('DB_PASSWORD', '123456');
[[email protected] ~]#

查看测试结果满意了以后,再使用sed-i参数直接对文件进行修改;

[[email protected] ~]# find /var/www/ -type f -name wp-config.php | xargs sed -i "s/PASSWORD', '.*'/PASSWORD', '123456'/g"
[[email protected] ~]# find /var/www/ -type f -name wp-config.php | xargs grep PASSWORD
/var/www/html/wp-config.php:define('DB_PASSWORD', '123456');
/var/www/2/wp-config.php:define('DB_PASSWORD', '123456');
/var/www/wp-config.php:define('DB_PASSWORD', '123456');
[[email protected] ~]#

这里要注意xargs的用法;有些朋友会问:grep和sed不是支持管道吗?怎么还要加xargs呢?

因为,如果不加xargs,那么sed和grep都是对搜索出来的文件名进行处理了,而不是对文件里面的内容。加了xargs,那么xargs就会将上个命令的结果,作为参数依次传递给下个命令使用。当然有些命令是不支持管道的,因而要加xargs处理一下。

好了,问题此时到这里呢,就基本上已经解决了。

解决这个问题,用到了很多的知识;有find、sed、grep、xargs、还有shell脚本等。收获不小啊~哈哈!

也希望大家多多给建议,这篇文章哪里写的不好的,还忘指正。

对了,对于上述有些命令的用法,有不懂的可以自行查找资料,还可以QQ私聊我哦,有空的话我会及时给你回复的;我的QQ:1031239088

总之,就是想大家一起进步嘛!

更多相关文章
  • 网友的工作中SEHLL问题:问题说明:需要截取以下命令输出的证书编码信息:#openssls_client-showcerts-connect192.168.0.111:443|sed-ne'/-BEGINCERTIFICATE-/,/-ENDCERTIFICATE-/p'(以下是证书的输出信息,期 ...
  • sed用法: sed 'Command' filename(s) 只显示结果而不修改文件.1.sed    '2,5d'    file 显示文件file,除去2-5行,但行数超过文件实际行数时不会报错.   sed    '/10[1-4]/d'      file 显示文件file,除去包含10 ...
  • 之前有位网友问过,批量修改文件名的方法.然后我当时也是不知道,后来搜索了些许资料我明白了,批量修改文件名可以有很多种方法!在这里向大家推荐我的老师的一篇博文,批量修改文件名.linux下批量修改文件名精彩解答案例分享 - 老男孩linux运维 - 51CTO技术博客http://oldboy.blo ...
  • Linux上文本处理三剑客之sed用法详解
        sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法.sed命令行格式为:         sed [-nefri] 'command' 输入文本 常用选项:        -n∶使用安静( ...
  • sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为:         sed [-nefri] 'command' 输入文本        常用选项:        -n∶使用安 ...
  • 文本编辑工具之sed用法简单命令和高级命令
    sed工作流程:        sed称为流编辑器,它一次是处理一行的内容,处理时,把当前匹配到的行存储在临时缓冲区中,名为"模式空间",接着sed命令就处理缓冲区中的内容,处理完后,就把内容输送到屏幕,然后接着处理下一行,直到文件的末尾.sed命令并不会修改原文件的内容,如果你 ...
  •  #sed [-nefri][动作]选项与参数:-n:使用安静(silent)模式.在一般 sed 的用法中,所有来自 STDIN的数据一般都会被列出到屏幕上.但如果加上 -n 参数后,则只有经过 sed 特殊处理的那一行(或者动作)才会被列出来. -e:直接在指令列模式上迚行 sed 的动作编辑: ...
  •  这是今天早上刚一上班,一个网友请教问题带出来的话题,个人感觉比较有普遍性,所以把QQ留言做了抄录,整理成一篇文章.话题不大,不过,我想这里面体现出来的职业化程序员在进行Coding的时候所秉持的一些设计原则还是很有借鉴意义的,大家可以参考一下.网友  9:39:17class Memory: pu ...
一周排行
  •        NFS是网络文件系统(Network File System)的缩写,是分布式计算系统的一个组成部分,可实现在异种网络上共享和装配远程文件系统.NFS是由SUN公司于1984年推出的.其最大的功能就是可 ...
  • yum (Yellowdog Update Modifier)  程序包管理器的前端工具    是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下 ...
  • 进入Exchange 2010 时代,终于可以实现自动化了.前两天看到一老外写的关于Cmdlet Extension Agents的使用,觉得蛮有意思的,自己测试了下,果然不错.下面是一些分享.首先,我们需要创建一个 ...
  • Hadoop数据传输工具sqoop
    概述sqoop是Apache顶级项目,主要用来在Hadoop和关系数据库中传递数据.通过s ...
  • 我还记得那天我上班正忙,被一团恶心的程序和一堆变态的需求折磨着,我那伟大的母亲大人特地打电话嘱咐我:“新婚姻法告诉我们,男人的车子不可靠了,房子不可靠了,女人必须得靠自己!”  字正腔圆,铿锵有力,顿时萎靡的我被她的 ...
  • 执行如下命令: mount -t cifs  //ip地址/api /mnt/ -o user=user,pass=pass提示如下错误:mount error(13): Permission denied Refe ...
  • OSI 七层通信模型:                                                                        7. 应用层             应用程序:Q ...
  • 最近在学习中突然想到,我在64位环境下,int取值范围是否有变化?为了检测这个结果,我做了以下这个测试:1.环境:win7旗舰版64位+vs2010 sp1(版本号:10.0.40219.1SP1Rel)+.Net ...
  • 如何在androidstudio配置svn
    1.下载最新的SVN客户端(1.8.1)http://tortoisesvn.net/do ...
  • C#note06——delegate和event
    1. Delegate类似于于c++中的函数指针,在C#中定义为一个类 声明定义时,有些像 ...