在多个目录中的文件中查找和替换包含引号的字符串 - 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的主要内容,如果未能解决你的问题,请参考以下文章