我目前正在尝试自动更新标题为original_file.txt 的文件的文本。想象一下该文件如下所示:
common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
text_that_will
be_removed
after_the_command
将通过删除“替换此行后的所有内容”之后的所有文本并将其替换为文件中的文本来更新此文件替换文件.txt。为了这篇文章的目的,假设 replacement_file.txt 具有以下文本:
testing123
this_is_the_replacement_text
从我用 sed 找到的内容来看,我只能弄清楚如何编辑特定短语之后的行的其余部分。我想用 replacement_file.txt 中的所有文本替换 original_file.txt 中替换短语后的文本(我想保留替换行文本以供将来更新)。 Original_file.txt 最后应如下所示:
common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text
提前致谢!
答案1
在 GNU/awk 中:
将这两个文件命名为参数。
awk '{ print; } /^### REPLACE EVERYTHING AFTER THIS LINE ###$/ { nextfile; }' fn1 fn2
答案2
打印所有行,直到找到“replace after”行,然后从其他文件读取并退出:
sed '/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{r replacement_file.txt
q;}' original_file.txt
- 用于
sed -i
保存更改 - 或者
... > tmp && mv tmp original
答案3
使用sed
:
sed -n -e '1,/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{ p; d; }' \
-e 'r replacement_file.txt' \
-e 'q' original_file.txt
这三个sed
块执行以下操作:
- 第一个块打印从第 1 行到具有特殊内容的行的所有行。我显式打印这些行
p
,然后调用d
以强制启动新循环(“print; next
” inawk
)。 - 在第一个块输出初始行后,第二个块输出额外文件的内容。
- 然后编辑脚本终止。
通常,q
在第三个块中会在退出之前输出当前行(这将是示例数据读取中的行text_that_will
),但由于sed
使用 调用-n
,因此禁止在循环结束时默认输出行。
根据您的数据,上述命令的结果是
common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text
要更新原始文件,您可以使用sed -i ...
,或将输出重定向到新文件,然后将原始文件替换为:
sed ... original_file.txt >original_file.txt.new &&
mv original_file.txt.new original_file.txt
答案4
如果使用 gnu awk:
awk '{print} /### REPLACE.../{system("cat replacement"); exit 0}' file