我需要一个脚本来用所有文件中的新库替换旧库[重复]
Posted
技术标签:
【中文标题】我需要一个脚本来用所有文件中的新库替换旧库[重复]【英文标题】:I need a script to replace old libraries with newer library in all files [duplicate] 【发布时间】:2019-10-04 20:09:10 【问题描述】:我在一个目录中有许多文件,我想用新的库替换所有这些文件中使用的库之一,因为旧库不再有效。
我使用ls > names.txt
将所有文件名列出到一个txt 文档中。然后我尝试编写一个 bash 脚本,该脚本将遍历所有文件,捕获旧库,并将其替换为新库。
for entry in names.txt
do
sed 's/<libOld>/<libNew>/g' $entry > $entry
done
我希望循环遍历每个文件名,找到使用的旧库,并将其替换为新库。然而,运行这个脚本似乎没有做任何事情。
【问题讨论】:
您的循环仅在文本文件上运行 鲍里斯发布的问题已经有了答案,谢谢 【参考方案1】:您遇到了一些常见问题;我已作为副本关闭,但以下是针对您的特定案例收集的修复:
使用 sed 就地编辑文件
使用 GNU sed:
sed -i 's/<libOld>/<libNew>/g' filename
使用任何 sed:
sed 's/<libOld>/<libNew>/g' filename > filename.tmp && mv filename.tmp filename
逐行循环文件
for entry in names.txt
只会将entry
设置为names.txt
,它不会读取其内容。这也是BashFAQ/001。
while IFS= read -r entry; do
printf '%s\n' "$entry"
done < names.txt
遍历目录中的所有文件
您不需要单独的文件,也不应该使用 ls
而是使用 glob:
for fname in ./*; do
printf '%s\n' "$fname"
done
结合你的情况
注意$entry
周围的双引号。
for entry in ./*; do
sed -i 's/<libOld>/<libNew>/g' "$entry"
done
可以简化为完全没有循环:
sed -i 's/<libOld>/<libNew>/g' ./*
【讨论】:
以上是关于我需要一个脚本来用所有文件中的新库替换旧库[重复]的主要内容,如果未能解决你的问题,请参考以下文章