以下命令正在正确更改%2个文件的内容。
sed -i 's/abc/xyz/g' xaa1 xab1
但我需要做的是动态更改几个这样的文件,而我不知道文件名。我想写一个命令,它将读取当前目录中的所有文件,从xa*
开始,sed
将更改文件内容。
发布于 2012-05-04 17:32:40
更好的是:
for i in xa*; do
sed -i 's/asd/dfg/g' $i
done
因为没有人知道那里有多少文件,而且很容易打破命令行限制。
下面是当文件太多时会发生的情况:
# grep -c aaa *
-bash: /bin/grep: Argument list too long
# for i in *; do grep -c aaa $i; done
0
... (output skipped)
#
发布于 2015-06-09 03:46:06
我很惊讶没有人提到要查找的-exec参数,虽然它会为每个匹配的文件名启动一个进程,但它是针对这种用例的:
find . -type f -name 'xa*' -exec sed -i 's/asd/dsg/g' {} \;
或者,可以使用xargs,这将调用更少的进程:
find . -type f -name 'xa*' | xargs sed -i 's/asd/dsg/g'
或者更简单地在find中使用+
exec variant而不是;
,以允许find为每个子流程调用提供多个文件:
find . -type f -name 'xa*' -exec sed -i 's/asd/dsg/g' {} +
发布于 2014-03-20 21:41:21
您可以同时使用grep和sed。这允许您以递归方式搜索子目录。
Linux: grep -r -l <old> * | xargs sed -i 's/<old>/<new>/g'
OS X: grep -r -l <old> * | xargs sed -i '' 's/<old>/<new>/g'
For grep:
-r recursively searches subdirectories
-l prints file names that contain matches
For sed:
-i extension (Note: An argument needs to be provided on OS X)
https://stackoverflow.com/questions/10445934
复制相似问题