hig*_*guy 5 sed awk text-processing
我有一个文件,其中包含一些文本和 - 在一行中 - 一个标记,指示应在何处添加新内容
foo
bar
%SUBSTITUTE%
foo
Run Code Online (Sandbox Code Playgroud)
行行替换应该由一个新的多行字符串替换text="some text"(请注意,我不知道该字符串可能是例如读取文件text=cat "file"`` 的结果)。替换的结果应该是
foo
bar
some text
%SUBSTITUTE%
foo
Run Code Online (Sandbox Code Playgroud)
我有一个基于perl它停止工作的工作版本(显然是由于 perl 版本更改)。现在我正在尝试像tr和那样的标准实用程序sed来替换该行。我遇到了一些麻烦,因为要粘贴的字符串可能包含任意字符,包括反斜杠等。我不想在粘贴之前转义这些字符。
有没有一种安全的方法可以使用标准工具来做到这一点?我为该问题找到的其他问题是已知要粘贴的文本的特定解决方案。
如果您拥有 sed 的 GNU 版本,您应该能够使用该r命令从文件中读取和插入新内容,然后删除标记行,例如
sed '/%SUBSTITUTE%/{
r path/to/newcontent
d
}' file
Run Code Online (Sandbox Code Playgroud)
如果您想在插入后保留%SUBSTITUTE%标记,这很棘手,因为无论您做什么,GNU扩展都会将文件内容排队,直到当前模式循环结束(之前保留它只是删除命令的问题)。可能最简单的方法是将其附加到文件中:您可以像这样即时执行此操作rdnewcontent
sed '/%SUBSTITUTE%/{
r /dev/stdin
d
}' file < <(sed '$a %SUBSTITUTE%' path/to/newcontent)
Run Code Online (Sandbox Code Playgroud)
采取完全不同的方法,您可以拆分第一个文件%SUBSTITUTE%,然后在新内容中添加 cat
csplit -s file '/%SUBSTITUTE%/'
cat xx00 newcontent xx01
Run Code Online (Sandbox Code Playgroud)
您还可以read在第一个文件的行上执行 bash循环,并在匹配标记字符串时对新的内容文件进行分类 - 但是我的指关节因建议在此论坛上进行文本处理的读取循环而受到抨击。不幸的是,两者都没有提供就地解决方案。