linux - 我需要一个脚本来用所有文件中的新库替换旧库

标签 linux bash

我的目录中有许多文件,并且希望用较新的库替换所有这些文件中使用的库之一,因为旧库不再工作。

我用过ls > names.txt将所有文件名列出到 txt 文档中。然后,我尝试编写一个 bash 脚本,该脚本将循环遍历所有文件,捕获旧库,并将其替换为新库。

for entry in names.txt
do
    sed 's/<libOld>/<libNew>/g' $entry > $entry
done

我希望循环遍历每个文件名,找到使用的旧库,并将其替换为新库。然而,运行此脚本似乎没有执行任何操作。

最佳答案

您遇到了一些常见问题;我已作为重复项关闭,但以下是针对您的具体情况收集的修复程序:

使用 sed 就地编辑文件

使用 GNU sed:

sed -i 's/<libOld>/<libNew>/g' filename

使用任何 sed:

sed 's/<libOld>/<libNew>/g' filename > filename.tmp && mv filename.tmp filename

逐行循环文件

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

关于linux - 我需要一个脚本来用所有文件中的新库替换旧库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56187322/

相关文章:

linux - 更改 while 循环内的变量

android - Linux 中的 Eclipse - 安装 Jcraft SFTP 插件时出错

c++ - 有没有办法在 Linux 上用 C++ 原子地刷新二进制信号量?

bash - 将文件夹树中的所有 .pdf 文件转换为 .png

linux - OIFS=$IFS; 是什么意思? IFS ="|";在 bash 脚本中

bash:函数范围外的变量

linux - 段错误 sysfs gpio linux odroid

bash - 如何使用 `local -` 将 shell 选项限制为函数?

linux - 在 bash 中将文本 append 到具有模式匹配名称的文件

linux - git别名不接收参数