更改多个文件
以下命令正确更改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
。