dda*_*tas 8 sed awk text-processing
我目前正在尝试自动更新名为 original_file.txt 的文件的文本。想象一下该文件如下所示:
common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
text_that_will
be_removed
after_the_command
Run Code Online (Sandbox Code Playgroud)
此文件将通过删除“替换此行之后的所有内容”之后的所有文本来更新,并将其替换为文件replacement_file.txt 中的文本。为了这篇文章,假设replacement_file.txt 有以下文本:
testing123
this_is_the_replacement_text
Run Code Online (Sandbox Code Playgroud)
根据我使用 sed 找到的内容,我只能弄清楚如何在某个短语之后编辑该行的其余部分。我想用replacement_file.txt中的所有文本替换original_file.txt中的文本(我想保留替换行文本以备将来更新)。original_file.txt 最后应该是这样的:
common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text
Run Code Online (Sandbox Code Playgroud)
提前致谢!
Pau*_*ant 15
在 GNU/awk 中:
将这两个文件命名为参数。
awk '{ print; } /^### REPLACE EVERYTHING AFTER THIS LINE ###$/ { nextfile; }' fn1 fn2
Run Code Online (Sandbox Code Playgroud)
row*_*oat 14
打印所有行,直到找到“替换后”行,然后从其他文件中读取并退出:
sed '/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{r replacement_file.txt
q;}' original_file.txt
Run Code Online (Sandbox Code Playgroud)
sed -i
保存更改... > tmp && mv tmp original
使用sed
:
sed -n -e '1,/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{ p; d; }' \
-e 'r replacement_file.txt' \
-e 'q' original_file.txt
Run Code Online (Sandbox Code Playgroud)
这三个sed
块这样做:
p
,然后调用d
以强制启动一个新循环(" print; next
" in awk
)。通常,q
在第三个块中会在退出之前输出当前行(这将是示例数据读取中的行text_that_will
),但由于使用sed
调用-n
,因此禁止在循环结束时默认输出行。
根据您的数据,上述命令的结果是
common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text
Run Code Online (Sandbox Code Playgroud)
要更新原始文件,您可以使用sed -i ...
,或将输出重定向到一个新文件,然后将原始文件替换为:
sed ... original_file.txt >original_file.txt.new &&
mv original_file.txt.new original_file.txt
Run Code Online (Sandbox Code Playgroud)
这将有效地使用任何 awk 和 cat:
$ awk '{print} /### REPLACE EVERYTHING AFTER THIS LINE ###/{exit}' original_file.txt &&
cat replacement_file.txt
common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text
Run Code Online (Sandbox Code Playgroud)
与任何 UNIX 工具一样,要更新原始文件,只需将输出写入临时文件,然后用该临时文件替换原始文件:
{ awk '{print} /### REPLACE EVERYTHING AFTER THIS LINE ###/{exit}' original_file.txt &&
cat replacement_file.txt; } > tmp && mv tmp original_file.txt
Run Code Online (Sandbox Code Playgroud)