首页 > 解决方案 > 用文本文件中的另一个递归替换一个 Windows 路径

问题描述

我在 Red Hat 服务器上存储了大量包含显式 Windows 路径的文本文件。今天,该路径已更改,我想更改文本文件以反映新路径。由于它们是 Windows 路径,它们都包含单个反斜杠。如果可能的话,我想保持单个反斜杠。

我想问一下执行此字符串替换的最佳方法是什么。我已经对文件夹进行了备份,以便在应用到将影响我的组成员的较大规模之前,我可以在较小规模上进行测试。

例子:

更改$oldPath$newPath递归包含在当前目录中的所有 *.py 文件。

$oldPath\common\file_referenced应该成为$newPath\common\file_referenced

标签: language-agnostic

解决方案


在每个 Unix 机器上的任何 shell 中稳健地使用任何 awk,无论您的旧目录路径或新目录路径包含哪些字符,以及旧目录或新目录中的最终目录是否可以是另一个现有目录名称的子字符串:

$ cat file
\old\fashioned\common\file_referenced

$ oldPath='\old\fashioned'
$ newPath='\new\fangled\etc'

$ awk '
    BEGIN { old=ARGV[1]; new=ARGV[2]; ARGV[1]=ARGV[2]="" }
    index($0"\\",old"\\")==1 { $0=new substr($0,length(old)+1) }
1' "$oldPath" "$newPath" file
\new\fangled\etc\common\file_referenced

要更新目录中的所有 .py 文件,您可以使用 GNU awk -i inplace,或者您可以这样做for i in *.py; do awk '...' old new "$i" > tmp && mv tmp "$i"; done,或者您可以使用find和/或xargs等 - 使用任何命令处理多个文件的任何常见 Unix 方法。


推荐阅读