我需要在目录中递归地对文件文本执行全局(重复)替换操作,但有一些限制给我带来了问题:
- 我需要以包含换行符的方式进行替换,这会破坏 sed,如下所述:为什么 sed 给我一个关于未终止的“s”的错误?
- 我需要将文件输出到不同的目录中,因为我使用的是 AWS DataPipeline,并且需要解决由于在命令执行期间从 InputDirectory 更改文件而发生的问题。 (因此,我需要将每个修改的文件写入具有相同文件名但位于 OutputDirectory 中的文件中。)
- 我在尝试全局输出文件名时也遇到了问题
因此,我可能剩下一些事情:
- 用于
find
枚举文件 - 循环遍历文件,对于每个文件,将输入路径替换为输出路径(也许甚至使用
sed
) cat
文件并将内容通过管道传输awk
到更新的路径并将内容写入。- 构造该过程中所需的任何目录(我相信这应该通过输出重定向自动发生,但我想明确地说以防万一)
有没有一种简单的方法可以做到这一点?
答案1
如果您使用 GNU
sed
,则可以\n
在替换字符串中使用换行符。对于 othersed
,使用文字换行符,但用反斜杠转义。使用
find ... -print | sed -e 's:oldpath:newpath:'
而不是 shell 循环来更改路径。如果 oldpath 或 newpath 包含
:
字符,请使用不同的分隔符。如果任何文件名可能包含换行符(其中是一个有效的文件名字符)并且 GNU sed 可供您使用(Linux 上的默认/标准),请使用 find 的
-print0
选项而不是-print
GNU sed 的-z
选项:sed -z -e 's:oldpath:newpath:'
mkdir -p "$(dirname "$filename")"
您可以为每个输入文件名创建类似的目录路径。为什么不直接使用
rsync -a sourcedir destdir
, 可选地使用一些相关--exclude
和/或--include
选项?