替换多个文件扩展名中的文本

时间:2014-06-21 06:10:26

标签: regex sed

我正在尝试使用sed替换多个文件中的一些文本。

例如:在目录及其子目录中的所有txt和md文件中将 lion 替换为 hashk

到目前为止,我从研究中得到的最佳(非工作)尝试是:

find . -type *.txt | xargs sed -i '' 's/lion/hawk/'

同时尝试将md添加到txt正则表达式 - * \。(txt | md)会出错。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:6)

你想要

find . -type f \( -name '*.txt' -o -name '*.md' \) -exec sed -i 's/lion/hawk/g' {} \;

-o是两个-name谓词的逻辑OR。您也可以直接使用-exec而不是管道xargs(两者都有效)。

修改更新的引用&括号。

答案 1 :(得分:1)

这应该适合你:

find . -type f -regextype egrep -regex ".*\.(txt|md)" -print0 | xargs -0 sed -i '' 's/lion/hawk/'

与您尝试的重要区别:

  • 使用-type f将搜索限制为仅限文件
  • 使用-regextype将正则表达式引擎设置为egrep(比默认的emacs更智能)
  • 使用-regex ".*\.(txt|md)"将搜索范围限制为txtmd分机
  • 的文件
  • 使用find -print0xargs -0正确处理文件名中的空格

答案 2 :(得分:0)

尝试下面的GNU find命令,

find . -name *.txt -o -name *.md -type f | xargs sed -i 's/lion/hawk/g'

<强>解释

.                              #  Current directory

-name *.md -o -name *.md       # Filenames end with .txt or .md
-type f                        #   Only files.
xargs sed -i 's/lion/hawk/g'    #  Replace lion with hawk on the founded files.