【问题标题】: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

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

【问题讨论】:

  • 您的循环仅在文本文件上运行
  • 鲍里斯发布的问题已经有了答案,谢谢

标签: linux bash


【解决方案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' ./*

【讨论】:

    猜你喜欢
    • 2020-11-24
    • 2020-03-16
    • 1970-01-01
    • 2020-07-10
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多