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

时间:2015-02-17 13:20:16

标签: replace sed find aix

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

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

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

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

当我测试上面的命令时,它在尝试替换字符串时清空了文件但是如果我针对单个文件运行命令,则更改是正确的。

有人可以对此有所了解吗?

提前谢谢

对我来说半工作的是以下几点:

2 个答案:

答案 0 :(得分:0)

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

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

这将在myfile.txt上执行command inplace并将旧文件保存在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

答案 1 :(得分:0)

在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