Linux在所有文件中查找和替换

经常会碰到这样的情况:查找某个目录下所有包含某个字符串的所有文件,并将这些文件中的这个字符串用另外的字符串替换进行替换。这种情况下,网网要检查的文件比较多,逐一进行检查替换太麻烦,这个时候,我们就应该找一个能够一条命令解决问题的方法。

1、grep命令

grep pattern file.txt命令默认的行为是将file.txt文件中,匹配pattern的行输出到标准输出。这个功能能帮助我们在文件中查找一个字符串出现的上下文,但是并不能够帮助我们实现下一步复杂的操作,所以有必要稍微了解下grep的一些选项。

现在测试文件的内容如下:

$ cat target.txt
 <a class="navbar-brand" href="http://yyy.xxx.edu.cn/">Panda Search</a>
text-decoration: none;" href="http://www.asdf.net/scholar/xindong_wu.html">Xindong
" href="http://asdf.net/scholar/Federi

 <a class="navbar-brand" href="http://yyy.xxx.edu.cn/">Panda Search</a>

 href="http://www.asdf.net/scholar/Gong-Qing_Wu.html">

href="http://asdf.net/scholar/Federico_Bocardi.html">Federico occardi</a></li><span class="Apple-converted-space"> </span><li style="display: inline-block; padding-right: 5px; padding-left: 5px;"><a style="color: rgb(66, 139

为了测试我们将这个文件,另外拷贝出两份,重命名然后放在如下的目录结构中:

$ tree .
.
├── a
│   └── target1.txt
├── target2.txt
└── target.txt

执行grep命令:

$ grep -rn "http://yyy.xxx.edu.cn" *
a/target1.txt:1:<a class="navbar-brand" href="http://yyy.xxx.edu.cn/">Panda Search</a>
a/target1.txt:5: <a class="navbar-brand" href="http://yyy.xxx.edu.cn/">Panda Search</a>
target2.txt:1:<a class="navbar-brand" href="http://yyy.xxx.edu.cn/">Panda Search</a>
target2.txt:5: <a class="navbar-brand" href="http://yyy.xxx.edu.cn/">Panda Search</a>
target.txt:1:<a class="navbar-brand" href="http://yyy.xxx.edu.cn/">Panda Search</a>
target.txt:5: <a class="navbar-brand" href="http://yyy.xxx.edu.cn/">Panda Search</a>

grep提供下面的选项:

*就是一般的bash通配符,表示当前目录所有文件,当然,你也可以写某个文件名

-r 是递归查找,意思就是也查找当前目录的子目录中的文件

-n 是显示行号

-i 忽略大小写

-l 列出匹配的文件名

-L 列出不匹配的文件名

-w 只匹配整个单词,而不是字符串的一部分(如只匹配‘man’,包括man两边有符号的如‘.man.’,或者是‘=man=’而不包括‘ woman ’或者是‘ manly ’)

2、Linux其他预备技能

2.1 将命令输出作为参数

方式有好多种,这里列出两种:``和$(),下面是一个例子。

$ echo `ls`
a target2.txt target.txt t.tt
$ echo $(ls)
a target2.txt target.txt t.tt

2.2 文件替换sed

sed命令的使用参见前面的文章,这里只说用到的地方:

sed -i "s/old/new/g" file1.txt file2.txt 可以将file*.txt中的所有old换成new。如果new什么都没有,就是表示删除old的意思。

3、将上面的技能串起来

这样,只需几行,就能够完成所有文件中,指定几种字符串的替换了。当然,也要注意下,sed命令的使用中,当有‘/‘字符的时候要注意转义,具体如下:

$ sed -i "s/http:\/\/yyy.xxx.edu.cn//g" $(grep -lr "http://yyy.xxx.edu.cn" *)
$ cat target.txt
<a class="navbar-brand" href="/">Panda Search</a>
text-decoration: none;" href="http://www.asdf.net/scholar/xindong_wu.html">Xindong
" href="http://asdf.net/scholar/Federi

 <a class="navbar-brand" href="/">Panda Search</a>

 href="http://www.asdf.net/scholar/Gong-Qing_Wu.html">

href="http://asdf.net/scholar/Federico_Bocardi.html">Federico occardi</a></li><span class="Apple-converted-space"> </span><li style="display: inline-block; padding-right: 5px; padding-left: 5px;"><a style="color: rgb(66, 139
$ sed -i "s/http:\/\/www.asdf.net//g" $(grep -lr "http://www.asdf.net" *)
$ sed -i "s/http:\/\/asdf.net//g" $(grep -lr "http://asdf.net" *)
$ cat target.txt
<a class="navbar-brand" href="/">Panda Search</a>
text-decoration: none;" href="/scholar/xindong_wu.html">Xindong
" href="/scholar/Federi

 <a class="navbar-brand" href="/">Panda Search</a>

 href="/scholar/Gong-Qing_Wu.html">

href="/scholar/Federico_Bocardi.html">Federico occardi</a></li><span class="Apple-converted-space"> </span><li style="display: inline-block; padding-right: 5px; padding-left: 5px;"><a style="color: rgb(66, 139
$

看到这里,或许你也明白我要做什么了。其实,是这样的,一位童鞋往我们线上的系统中加了几个静态网页,网页中用到的超链全部是直接从浏览器复制过来的,包括站内的跳转。这样明显不科学,尽管当时是没毛病,但是现在我们的域名要换了,问题就来了,这些老域名的跳转链接都不能访问了。为了根治这个问题,我决定将这些站内跳转的域名部分全部删掉,就能够实现正常的跳转了。由于文件太多,只好用了上面的方法。

时间: 2024-10-14 13:31:34

Linux在所有文件中查找和替换的相关文章

linux在所有文件中查找某一个字符

# find <directory> -type f -name "*.c" | xargs grep "<strings>" <directory>是你要找的文件夹:如果是当前文件夹可以省略-type f 说明,只找文件-name "*.c" 表示只找C语言写的代码,从而避免去查binary:也可以不写,表示找所有文件<strings>是你要找的某个字符串 sudo find -type f -n

Ubuntu中的在文件中查找和替换命令

1.查找 find /home/guo/bin -name /*.txt | xargs grep 'jdbc' 查找 /home/guo/bin 目录下所有后缀为.txt 的文件(PS:/* 转义* 为统配符),通过 xargs 命令传递给 grep 作为文件参数 grep 'jdbc' 所搜显示文件中所有包含 jdbc字符串的行 2.替换 find /home/guo/bin -name /*.txt | xargs sed -i 's/@/1/g' 查找 /home/guo/bin 目录下

linux 多个文件中查找字符串

2015年2月9日 14:36:38 # find <directory> -type f -name "*.c" | xargs grep "<strings>" <directory>是你要找的文件夹:如果是当前文件夹可以省略-type f 说明,只找文件-name "*.c" 表示只找C语言写的代码,从而避免去查binary:也可以不写,表示找所有文件<strings>是你要找的某个字符串

在文件夹下所有文件中查找字符串(linux/windows)

在linux下可以用 grep "String" filename.txt#字符串 文件名grep -r "String" /home/#递归查找目录下所有文件来查找单个文件或者目录下所有文件是否包含某个字符串 windows下同样可以实现类似功能 findstr可以完成这个工作. findstr /s /i "string" *.*上面的命令表示,当前目录以及当前目录的所有子目录下的所有文件中查找"string"这个字符串.

linux命令在文件中根据命令查找

find . -type f -name "*.tmp" | xargs grep -ri "2016-08-30 04:00:00|2016-08-30 05:00:00" -l //在当前目录以下,在*.tmp所有文件中查找内容为“2016-08-30 04:00:00|2016-08-30 05:00:00”的匹配数据

如何在CAD编辑器中查找和替换文字?

如何在CAD编辑器中查找和替换文字?在编辑CAD图纸的时候,如果全部是用手去绘制的话非常的浪费时间,所以就需要借助一些CAD编辑器来绘制CAD图纸,但是在绘制的过程中一张CAD图纸是由许多部分组成的,为了查找方便需要在CAD图纸中标注一些文字,如果发现标注错误的话,那要怎么办呢?如何在CAD编辑器中查找和替换文字?具体要怎么来操作?下面就来教教大家,想要了解的朋友就一起来看看吧! 使用步骤一:首先还是需要在日常使用的电脑中任意的打开一个浏览器,在浏览器的搜索框中搜索迅捷CAD编辑器专业版,进入官

excel文件中*字符如何替换

excel文件中*字符如何替换? (1)分析:在excel中,*表示多个字符的通配符,所以无法直接用*去查找替换. (2)输入~*~,则可以进行查找和替换. 原文地址:https://www.cnblogs.com/apromise/p/10847020.html

Visual Studio 2013 无法使用:在文件中查找(Ctrl+Shift+F)

最近遇到一个问题就是在win7(32位.64位都试过)上安装Visual Studio 2013(专业版.旗舰版都试过)之后,打开项目,使用:在文件中查找(Ctrl+Shift+F)功能时,会突然奔溃. 后来,突然想到在安装的时候,右键,以管理员身份安装. 于是,尝试了一下,搞定!

从OTF字体文件中查找字体名称

for in ? 使用神器vim就好了... vim ./AKZIDENZGROTESK-COND.OTF 从OTF字体文件中查找字体名称,布布扣,bubuko.com