下面的命令正确地更改了2个文件的内容。
sed -i 's/abc/xyz/g' xaa1 xab1
但是我需要动态更改几个这样的文件,我不知道文件名。我想写一个命令,将读取当前目录下以xa*开头的所有文件,sed应该改变文件内容。
下面的命令正确地更改了2个文件的内容。
sed -i 's/abc/xyz/g' xaa1 xab1
但是我需要动态更改几个这样的文件,我不知道文件名。我想写一个命令,将读取当前目录下以xa*开头的所有文件,sed应该改变文件内容。
当前回答
更好的是:
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)
#
其他回答
你能使
你搜索'xxxx'文本,并将其替换为'yyyy'
grep -Rn '**xxxx**' /path | awk -F: '{print $1}' | xargs sed -i 's/**xxxx**/**yyyy**/'
这些命令在Mac OS X自带的默认sed中不起作用。
来自男人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*
and
for i in logfile*; do sed -i '.bak' 's/old/new/g' $i; done
两者都工作得很好。
银色搜索者解决方案
我为那些不知道名为Silver Searcher(命令行工具是ag)的神奇工具的人添加了另一个选择。
注意:你可以使用grep和其他工具来做同样的事情,但是Silver Searcher很棒:)
TLDR
ag -l 'abc' | xargs sed -i 's/abc/xyz/g'
安装银色搜索器
sudo apt install silversearcher-ag # Debian / Ubuntu
sudo pacman -S the_silver_searcher # Arch / EndeavourOS
sudo yum install epel-release the_silver_searcher # RHEL / CentOS
演示文件
将以下内容粘贴到您的终端以创建一些演示文件:
mkdir /tmp/food
cd /tmp/food
content="Everybody loves to abc this food!"
echo "$content" > ./milk
echo "$content" > ./bread
mkdir ./fastfood
echo "$content" > ./fastfood/pizza
echo "$content" > ./fastfood/burger
mkdir ./fruit
echo "$content" > ./fruit/apple
echo "$content" > ./fruit/apricot
使用“ag)”
下面的ag命令将递归地找到包含字符串'abc'的所有文件。它会忽略.git目录、.gitignore文件和其他忽略文件:
$ ag 'abc'
milk
1:Everybody loves to abc this food!
bread
1:Everybody loves to abc this food!
fastfood/burger
1:Everybody loves to abc this food!
fastfood/pizza
1:Everybody loves to abc this food!
fruit/apple
1:Everybody loves to abc this food!
fruit/apricot
1:Everybody loves to abc this food!
只列出包含字符串'abc'的文件,使用-l开关:
$ ag -l 'abc'
bread
fastfood/burger
fastfood/pizza
fruit/apricot
milk
fruit/apple
修改多个文件
最后,使用xargs和sed,我们可以用另一个字符串替换'abc'字符串:
ag -l 'abc' | xargs sed -i 's/abc/eat/g'
在上面的命令中,ag列出了包含字符串'abc'的所有文件。xargs命令分割文件名,并将它们分别输送到sed命令中。
另一种更通用的方法是使用find:
sed -i 's/asd/dsg/g' $(find . -type f -name 'xa*')
我使用find来完成类似的任务。这很简单:你必须像这样将它作为sed的参数传递:
sed -i 's/EXPRESSION/REPLACEMENT/g' ' find -name "文件。正则表达式”
这样就不需要编写复杂的循环,而且很容易看出要更改哪些文件,只需在运行sed之前运行find即可。