我需要一个脚本来用所有文件中的新库替换旧库[重复]

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' ./*

【讨论】:

以上是关于我需要一个脚本来用所有文件中的新库替换旧库[重复]的主要内容,如果未能解决你的问题,请参考以下文章

不停服务进行数据数据迁移

robomongo 怎么导出数据

使用 VBScripts 将文本文件 unix 行结尾替换为 Windows [重复]

Lint:使用变量时“可用的新库版本”

向java添加新库[重复]

.NET - 此脚本的每个单独部分都可以工作,但是作为一个整体运行它会导致它替换我的SVG文件中的所有文本