在多个文件中查找和替换文本


Answers:


136

在这里,我使用sed在目录/ home / user / directory /中以扩展名c替换每个文件中每次出现的“ cybernetnews”,并将其替换为“ cybernet”。

find /home/user/directory -name \*.c -exec sed -i "s/cybernetnews/cybernet/g" {} \;

一种更通用的变体,在该变体中,您从执行目录中进行递归搜索并仅对常规,可读,可写的文件进行操作:

find ./ -type f -readable -writable -exec sed -i "s/cybernetnews/cybernet/g" {} \;

2
为此投票,因为它是一种有效的方法
Sabacon 2011年

4
投票是因为sed是IMO的最佳选择,但是如果您解释了答案的组成部分,答案将更为有用(个人而言,我对{} \;并不熟悉,也很好奇)
sequoia mcdowell

5
@sequoiamcdowell呜!我错过了!抱歉。花括号的意思是基本上“每次匹配”,转义的分号(\;)是为了防止重复解析。我们不希望bourne兼容的shell和sed尝试解析命令,而只是sed。

如果单词包含空格,@ Christopher将如何工作cyber net news?我如何将其转换为cyber net
库尔希德·阿拉姆

1
@KhurshidAlam将字符类与-e开关一起使用:sed -i -e "s/cyber\snet\snews/cyber net/g"

27

流编辑器sed是用于此类工作的强大实用程序,是我的首选,但是,如果要使用基于Ubuntu的本机应用程序通过普通文本编辑器执行此操作,建议您看一下Jedit ,它在存储库中可用,可以通过在控制台中键入来安装:

sudo apt-get install jedit

启动jedit,单击搜索菜单项,在菜单列表中,单击“在目录中搜索”项,将显示以下对话框:

Jedit在文件夹中搜索对话框

这与Notepad ++类似,并且执行相同的操作,我相信这是您想要的。


这非常适合当我搜索完整的代码行时,并且如果我使用做了同样的事情,则犹豫是否要转义每个正则表达式特殊字符sed
IQAndreas

您可以在几秒钟内替换代码块(例如html,javascript等)。
lepe 2014年

这在大量文件上不起作用,几个小时后它并没有进行替换,而geany花了几分钟才找到所有出现的文件。这可能不是一个有效的搜索和替换方法,但可以很好地加热房间。
马克·阿罗尼

19

另一个GUI选项是regexxerregexxer屏幕截图


完美运行(如果您已经熟悉Regex),谢谢。
欧内斯特(Ernest)

1
甚至,如果您不了解正则表达式,也可以将此工具用作简单的字符串搜索和替换工具,它将为您完成工作,而无需正则表达式或其他任何东西。
Mohd Abdul Mujib

13
perl -pi -e 's/oldtext/newtext/g' *

在当前文件夹的所有文件中,将所有出现的旧文本替换为新文本。但是,您将必须使用反斜杠对oldtext和newtext中的所有perl特殊字符进行转义。


9

Geany一起检查,它是Linux的完美NPP替代品。您可以做到这一点,再加上可以使用正则表达式。


我爱Geany!它是我最喜欢的编辑器,功能强大。
Pisu

1
据我所知,Geany 1.23.1(与Ubuntu 13.10打包在一起)允许使用正则表达式搜索多个文件,但不能替换其中的文件。
Drew Noakes

如果打开了所有文件,然后使用“搜索/替换”对话框中的“会话中”按钮,则可以在Geany中搜索和替换多个文件。
MV。

1
如何打开“消息”选项卡中列出的5000个文件?
马克·阿罗尼

1
好的,regexxer几乎是我一直想要的,由于它的名称带有正则表达式,所以我刚刚略过了它,而我只是倾向于避免与正则表达式有关的任何事情。但是我错了,该工具是否具有搜索和替换所需的东西。
Mohd Abdul Mujib


2

您可以使用此脚本,复制代码并创建文件find_and_replace_in_files.sh

我做了一点修改。请告诉我您的意见。

# *****************************************************************************************
# find_and_replace_in_files.sh
# This script does a recursive, case sensitive directory search and replace of files
# To make a case insensitive search replace, use the -i switch in the grep call
# uses a startdirectory parameter so that you can run it outside of specified directory - else this script will modify itself!
# *****************************************************************************************

!/bin/bash
# **************** Change Variables Here ************
startdirectory="/your/start/directory"
searchterm="test"
replaceterm="test=ok!"
# **********************************************************

echo "***************************************************"
echo "* Search and Replace in Files Version 01-Aug-2012 *"
echo "***************************************************"

i=0; 

  for file in $(grep -l -R $searchterm $startdirectory)
    do
      cp $file $file.bak
      sed -e "s/$searchterm/$replaceterm/ig" $file > tempfile.tmp
      mv tempfile.tmp $file

    let i++;

      echo "Modified: " $file
    done

echo " *** All Done! *** Modified files:" $i

2

另一个程序是Searchmonkey

SearchMonkey是一个轻量级的Gtk应用程序,旨在用一个光滑的用户界面来代替繁琐的查找/ grep,该用户界面可快速提供标记,以显示文本匹配的位置和数量。目标是为最终用户和软件开发人员提供一种易于使用且易于访问的搜索工具。


2
find . -name "*.txt" |xargs sed -i "s/searched_Text/replacement_Text/g"

在fedora上为我工作



@muru运行更少的sed实例!因此,就CPU时间而言,它要快得多。因为文件访问时间是有限制的,所以我认为它的时钟时间并没有快很多,但是却降低了系统负载。注意,xargs将在单个sed命令的命令行上放置很多文件名,例如杂乱无章的文件名-根据路径的长度填充可用的缓冲区大小。
Volker Siegel 2014年

嗯...如果这个问题解决了,我可以用一个清楚地解释为什么它比被推荐的更好的替代它。
Volker Siegel 2014年

@VolkerSiegel可以+代替\;in 实现find,对吗?
muru

1
@muru可能...我的“工作的严密工具”本能显然更喜欢xargs,但您是对的。来自man find-exec command {} +:... The command line is built in much the same way that xargs...。让我想到git filter-branch…… 的命令行;)
Volker Siegel 2014年

2

一个非常简单的解决方案:将*.txt文件夹中的所有文件替换string_1string_2

sed -i 's/string_1/string_2/g' *.txt

好答案!只是一些补充。如果要递归替换当前目录中任何文件中的字符串,请尝试以下操作:sed -i 's/string_1/string_2/g' $(grep -rEl 'string_1' ./)
drugan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.