kev*_*kev 534
cd /path/to/your/folder
sed -i 's/foo/bar/g' *
Run Code Online (Sandbox Code Playgroud)
"foo"的出现将被"bar"取代.
Cél*_*urd 226
类似于Kaspar的答案,但使用g标志来替换一行中的所有事件.
find ./ -type f -exec sed -i 's/string1/string2/g' {} \;
Run Code Online (Sandbox Code Playgroud)
对于全局不区分大小写:
find ./ -type f -exec sed -i 's/string1/string2/gI' {} \;
Run Code Online (Sandbox Code Playgroud)
pym*_*rco 131
@kev的答案很好,但只影响直接目录中的文件.下面的例子使用grep来递归查找文件.它每次都适合我.
grep -rli 'old-word' * | xargs -i@ sed -i 's/old-word/new-word/g' @
Run Code Online (Sandbox Code Playgroud)
Kas*_*lgi 32
这对我有用:
find ./ -type f -exec sed -i 's/string1/string2/' {} \;
Run Code Online (Sandbox Code Playgroud)
然而,这并没有:sed -i 's/string1/string2/g' *
.也许"foo"不是string1而"bar"不是string2.
jle*_*evy 31
已经列出了一些标准答案.通常,您可以使用find以递归方式列出文件,然后使用sed或perl执行操作.
对于大多数快速使用,您可能会发现命令rpl更容易记住.这是替换(foo - > bar),递归地对所有文件:
rpl -R foo bar .
您可能需要安装它(apt-get install rpl
或类似的).
然而,对于涉及正则表达式和反向替换,或文件重命名以及搜索和替换的更艰难的工作,我所知道的最通用和最强大的工具是repren,我写了一段时间的小Python脚本棘手的重命名和重构任务.您可能更喜欢它的原因是:
要使用它,pip install repren
.查看自述文件以获取示例.
Dja*_*omo 27
要替换多个文件中的字符串,您可以使用:
grep -rl string1 somedir/ | xargs sed -i 's/string1/string2/g'
Run Code Online (Sandbox Code Playgroud)
例如
grep -rl 'windows' ./ | xargs sed -i 's/windows/linux/g'
Run Code Online (Sandbox Code Playgroud)
Ign*_*ant 22
鉴于您想搜索字符串search
并将其替换为replace
跨多个文件,这是我经过实战检验的单行公式:
grep -RiIl 'search' | xargs sed -i 's/search/replace/g'
Run Code Online (Sandbox Code Playgroud)
快速grep解释:
-R
- 递归搜索-i
- 不区分大小写-I
- 跳过二进制文件(你想要文本,对吧?)-l
- 打印一个简单的列表作为输出。其他命令需要然后将 grep 输出通过管道传输到 sed(通过 xargs),用于实际替换文本。该-i
标志将直接更改文件。将其删除为一种“试运行”模式。
Ily*_*ski 19
要替换文件中的路径(避免转义字符),您可以使用以下命令:
sed -i 's@old_path@new_path@g'
Run Code Online (Sandbox Code Playgroud)
@符号表示应在后面的字符串中忽略所有特殊字符.
小智 17
如果您的字符串中包含正斜杠(/),则可以将分隔符更改为"+".
find . -type f -exec sed -i 's+http://example.com+https://example.com+g' {} +
Run Code Online (Sandbox Code Playgroud)
此命令将在当前目录中递归运行.
小智 11
"foo"的第一行出现将替换为"bar".你可以使用第二行来检查.
grep -rl 'foo' . | xargs sed -i 's/foo/bar/g'
grep 'foo' -r * | awk -F: {'print $1'} | sort -n | uniq -c
Run Code Online (Sandbox Code Playgroud)
Paw*_*iel 10
如果您有可以使用的文件列表
replace "old_string" "new_string" -- file_name1 file_name2 file_name3
Run Code Online (Sandbox Code Playgroud)
如果您有可以使用的所有文件
replace "old_string" "new_string" -- *
Run Code Online (Sandbox Code Playgroud)
如果您有包含扩展名的文件列表,则可以使用
replace "old_string" "new_string" -- *.extension
Run Code Online (Sandbox Code Playgroud)
“您也可以使用find和sed,但是我发现这行perl很好用。
perl -pi -w -e 's/search/replace/g;' *.php
Run Code Online (Sandbox Code Playgroud)
”(摘自http://www.liamdelahunty.com/tips/linux_search_and_replace_multiple_files.php)
我最好的结果来自使用perl和grep(以确保文件具有搜索表达式)
perl -pi -w -e 's/search/replace/g;' $( grep -rl 'search' )
Run Code Online (Sandbox Code Playgroud)
在找到这个问题(和答案)之前,我确实制定了自己的解决方案。我搜索了“替换”“几个”和“xml”的不同组合,因为那是我的应用程序,但没有找到这个特定的组合。
我的问题:我有 spring xml 文件,其中包含测试用例的数据,其中包含复杂的对象。对java源代码的重构改变了很多类并且不适用于xml数据文件。为了保存测试用例数据,我需要更改分布在多个目录中的所有 xml 文件中的所有类名称。同时保存原始 xml 文件的备份副本(尽管这不是必须的,因为版本控制会将我保存在这里)。
我一直在寻找find
+的某种组合sed
,因为它在其他情况下对我有用,但不能同时进行多个替换。
然后我发现询问 ubuntu 响应,它帮助我构建了我的命令行:
find -name "*.xml" -exec sed -s --in-place=.bak -e 's/firstWord/newFirstWord/g;s/secondWord/newSecondWord/g;s/thirdWord/newThirdWord/g' {} \;
Run Code Online (Sandbox Code Playgroud)
它工作得很好(嗯,我的箱子有六种不同的替代品)。但请注意,它将触及当前目录下的所有 *.xml 文件。因此,如果您对版本控制系统负责,您可能需要首先进行过滤,然后只传递给sed
那些实际拥有您想要的字符串的人;喜欢:
find -name "*.xml" -exec grep -e "firstWord" -e "secondWord" -e "thirdWord" {} \; -exec sed -s --in-place=.bak -e 's/firstWord/newFirstWord/g;s/secondWord/newSecondWord/g;s/thirdWord/newThirdWord/g' {} \;
Run Code Online (Sandbox Code Playgroud)
真的很蹩脚,但我无法让任何 sed 命令在 OSX 上正常工作,所以我做了这个愚蠢的事情:
:%s/foo/bar/g
:wn
Run Code Online (Sandbox Code Playgroud)
^- 将这三行复制到我的剪贴板中(是的,包括结尾换行符),然后:
六*
并按住 command-v 直到它说没有剩余文件。
愚蠢...黑客...有效...
在 MacBook Pro 上,我使用了以下内容(灵感来自/sf/answers/1362004941/):
sed -i '' -e 's/<STR_TO_REPLACE>/<REPLACEMENT_STR>/g' *
Run Code Online (Sandbox Code Playgroud)
-i ''
将确保您没有备份。
-e
对于现代正则表达式。
归档时间: |
|
查看次数: |
468326 次 |
最近记录: |