更改多个文件

以下命令正确更改2个文件的内容。

sed -i 's/abc/xyz/g' xaa1 xab1 

但我需要做的是dynamic地改变几个这样的文件,我不知道文件名。 我想写一个命令,将从当前目录中读取所有文件从xa*开始, sed应该改变文件内容。

更好的是:

 for i in xa*; do sed -i 's/asd/dfg/g' $i done 

因为没有人知道有多less文件,很容易打破命令行限制。

以下是文件太多时会发生的情况:

 # grep -c aaa * -bash: /bin/grep: Argument list too long # for i in *; do grep -c aaa $i; done 0 ... (output skipped) # 

我很惊讶没有人提到-exec的参数来寻找,这可能是这样做的正确方法:

 find . -type f -name 'xa*' -exec sed -i 's/asd/dsg/g' {} \; 

或者,可以使用xargs,这会调用更less的进程:

 find . -type f -name 'xa*' | xargs sed -i 's/asd/dsg/g' 

你可以使用grep和sed在一起。 这使您可以recursionsearch子目录。

 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) 

这些命令不适用于Mac OS X附带的默认sed

man 1 sed

 -i extension Edit files in-place, saving backups with the specified extension. If a zero-length extension is given, no backup will be saved. It is not recommended to give a zero-length extension when in-place editing files, as you risk corruption or partial content in situations where disk space is exhausted, etc. 

试着

 sed -i '.bak' 's/old/new/g' logfile* 

 for i in logfile*; do sed -i '.bak' 's/old/new/g' $i; done 

两者都很好。

@PaulR发表了这个评论,但人们应该把它作为一个答案(和这个答案最适合我的需要):

 sed -i 's/abc/xyz/g' xa* 

这将适用于适量的文件,可能是几十个,但可能不是数百万的数量级 。

另一种更通用的方法是使用find

 sed -i 's/asd/dsg/g' $(find . -type f -name 'xa*') 

你可以做

' xxxx '文本üsearch并将replace为' yyyy '

 grep -Rn '**xxxx**' /path | awk -F: '{print $1}' | xargs sed -i 's/**xxxx**/**yyyy**/' 

我正在使用find类似的任务。 这很简单:你必须把它作为sed的参数来传递,像这样:

sed -i 's/EXPRESSION/REPLACEMENT/g' `find -name "FILE.REGEX"`

这样你就不必编写复杂的循环,而且很容易看出,你将要更改哪些文件,在运行sed前运行find