如何通过sed或awk递归替换文件中的字符串?

时间:2017-03-31 00:00:41

标签: linux macos awk sed

我想知道如何从命令行搜索获取各种.rb类型文件中的字符串。

替换

.delay([ANY OPTIONAL TEXT FOR DELETION]).

.delay.

除了sed awk之外,操作系统中还包含其他任何更适合该任务的命令行工具吗?

状态

到目前为止,我有以下正则表达式:

.delay\(*.*\)\.

我想知道如何只匹配第一个右括号结尾的表达式?并避免更换:

.delay([ANY OPTIONAL TEXT FOR DELETION]).sometext(param)

提前致谢!

3 个答案:

答案 0 :(得分:2)

如果您需要查找和替换文件中的文本 - sed似乎是最好的命令行解决方案。

在文本文件中搜索字符串并替换:

sed -i 's/PATTERN/REPLACEMENT/' file.name

或者,如果您需要处理文件中PATTERN的多个出现,请添加g

sed -i 's/PATTERN/REPLACEMENT/g' file.name

对于多个文件处理 - 将文件列表重定向到sed:

echo "${filesList}" | xargs sed -i ...

答案 1 :(得分:1)

您可以使用find生成文件列表,并xargs对结果运行sed

find . -type f -print | xargs sed -i 's/\.delay.*/.delay./'

find将生成当前目录中包含的文件列表(.,尽管您当然可以传递不同的目录),xargs将读取该列表,然后运行{ {1}}以文件列表作为参数。

此处生成所有文件的列表,而不是sed,您可以使用find之类的内容生成包含特定术语的文件列表。 E.g:

grep

答案 2 :(得分:0)

对于问题的一部分,您希望仅匹配并替换第一个)而不包含第二对(),以下是如何更改正则表达式:

.delay\(*.*\)\.

- >

\.delay\([^\)]*\)

即。匹配"实际点,延迟,支撑打开,一切但支撑关闭和支撑关闭"。

E.g。使用sed:

>echo .delay([ANY OPTIONAL TEXT FOR DELETION]).sometext(param) | sed -E "s/\.delay\([^\)]*\)/.delay/"  
  

.delay.sometext(PARAM)

我建议使用grep来查找正确的文件:

grep -rl --include "*.rb" '\.delay' .

然后按照其他答案的建议将列表输入xargs。

相信其他答案提供了将多个文件输入sed的解决方案。