【问题标题】:Find and repalce string that includes quotes within files in multiple directories - unix aix在多个目录中的文件中查找和替换包含引号的字符串 - 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

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

有人可以解释一下吗?

提前谢谢你

对我来说半有用的是:

【问题讨论】:

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

标签: replace sed find aix


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 2013-02-19
      • 2013-05-17
      • 2013-07-06
      • 2010-12-25
      • 2015-07-23
      • 2015-12-13
      • 2014-03-01
      • 2012-02-13
      相关资源
      最近更新 更多