DataPipeline - 重复替换导致 sed 出现问题(如所解释的)并且需要将文件写入新位置

DataPipeline - 重复替换导致 sed 出现问题(如所解释的)并且需要将文件写入新位置

我需要在目录中递归地对文件文本执行全局(重复)替换操作,但有一些限制给我带来了问题:

  1. 我需要以包含换行符的方式进行替换,这会破坏 sed,如下所述:为什么 sed 给我一个关于未终止的“s”的错误?
  2. 我需要将文件输出到不同的目录中,因为我使用的是 AWS DataPipeline,并且需要解决由于在命令执行期间从 InputDirectory 更改文件而发生的问题。 (因此,我需要将每个修改的文件写入具有相同文件名但位于 OutputDirectory 中的文件中。)
  3. 我在尝试全局输出文件名时也遇到了问题

因此,我可能剩下一些事情:

  1. 用于find枚举文件
  2. 循环遍历文件,对于每个文件,将输入路径替换为输出路径(也许甚至使用sed
  3. cat文件并将内容通过管道传输awk到更新的路径并将内容写入。
  4. 构造该过程中所需的任何目录(我相信这应该通过输出重定向自动发生,但我想明确地说以防万一)

有没有一种简单的方法可以做到这一点?

答案1

  1. 如果您使用 GNU sed,则可以\n在替换字符串中使用换行符。对于 other sed,使用文字换行符,但用反斜杠转义。

  2. 使用find ... -print | sed -e 's:oldpath:newpath:'而不是 shell 循环来更改路径。

    如果 oldpath 或 newpath 包含:字符,请使用不同的分隔符。

    如果任何文件名可能包含换行符(其中一个有效的文件名字符)并且 GNU sed 可供您使用(Linux 上的默认/标准),请使用 find 的-print0选项而不是-printGNU sed 的-z选项:sed -z -e 's:oldpath:newpath:'

  3. mkdir -p "$(dirname "$filename")"您可以为每个输入文件名创建类似的目录路径。

  4. 为什么不直接使用rsync -a sourcedir destdir, 可选地使用一些相关--exclude和/或--include选项?

相关内容