在多个目录中的文件中查找和替换包含引号的字符串 - unix aix

Posted

技术标签:

【中文标题】在多个目录中的文件中查找和替换包含引号的字符串 - unix aix【英文标题】:Find and repalce string that includes quotes within files in multiple directories - unix aix 【发布时间】:2015-04-18 05:00:09 【问题描述】:

所以这就是场景。我想在安装中的 100 个文件中将以下值从 true 更改为 false,但无法弄清楚该命令并且已经为此工作了几天。我所拥有的是一个简单的脚本,它查找文件的所有实例并将结果存储在文件中。我正在使用这个命令来查找我需要修改的文件:

find /directory -type f \ ( -name 'filename' \) > file_instances.txt

现在我想做的是运行以下命令或其变体来修改以下值:

sed 's/directoryBrowsingEnabled="false"/directoryBrowsingEnabled="true"/g' $i > $i

当我测试上述命令时,它在尝试替换字符串时已将文件清空,但如果我对单个文件运行该命令,则更改正确。

有人可以解释一下吗?

提前谢谢你

对我来说半有用的是:

【问题讨论】:

你的问题以一种悬而未决的方式结束......而且,你的问题不是来自引号的存在,所以你可能想改变你的标题。 【参考方案1】:

您可以使用-i 选项调用sed,而不是使用> $i。您甚至可以通过添加后缀来备份旧文件以防万一。

sed -e 'command' -i.backup myfile.txt

这将在 myfile.txt 上就地执行 command 并将旧文件保存在 myfile.txt.backup 中。

编辑: 不使用-i 确实可能会导致空白文件,这是因为 unix 不喜欢你同时读取和写入(它会导致竞争条件)。

您可以通过一些简单的cat 命令来说服自己:

$ echo "This is a test" > test.txt
$ cat test.txt > test.txt # This will return an error cat being smart
$ cat <test.txt >test.txt # This will blank the file, cat being not that smart

【讨论】:

【参考方案2】:

在 AIX 上,您可能缺少 sed 的 -i 选项。伤心。您可以制作一个脚本,将每个文件移动到一个 tmp 文件并重定向(使用 sed)到原始文件,或者尝试使用 vi 的 here-construction:

cat file_instances.txt | while read file; do
   vi $file<<END >/dev/null 2>&1
:1,$ s/directoryBrowsingEnabled="false"/directoryBrowsingEnabled="true"/g
:wq
END
done

【讨论】:

以上是关于在多个目录中的文件中查找和替换包含引号的字符串 - unix aix的主要内容,如果未能解决你的问题,请参考以下文章

Perl:在多个文本文件中查找和替换特定字符串

《web前端笔记7》js字符—获取、查找、遍历、提取、替换方法总结

从sed中的文本文件中查找并替换多个字符串[重复]

文件包含与结构体

批量替换多个文件里边的字符串

在所有子目录中的文件中查找和替换文本[重复]