我正在尝试使用sed替换多个文件中的一些文本。
例如:在目录及其子目录中的所有txt和md文件中将 lion 替换为 hashk 。
到目前为止,我从研究中得到的最佳(非工作)尝试是:
find . -type *.txt | xargs sed -i '' 's/lion/hawk/'
同时尝试将md添加到txt正则表达式 - * \。(txt | md)会出错。
提前感谢您的帮助。
答案 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)"
将搜索范围限制为txt
或md
分机find -print0
和xargs -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.