linux - 使用正则表达式修改文本文件

标签 linux file shell sed replace

我有一个包含特定字符串的源文件,我想用另一个文件的内容替换该字符串的第一个(在本例中是唯一的)实例。像这样的东西:

> cat source.txt
Hello
KEYWORD
Hi
> cat replacement.txt
Replacement
> <sed command>
> cat source.txt
Hello
Replacement
Hi

有没有办法用 sed 做到这一点?或者任何其他编辑器?

最佳答案

我认为 awk 可以更轻松地完成这项工作:

如果您想在 replace.txt 中保留结束换行符:

awk -v RS="\0" -v ORS="" 'NR==FNR{r=$0;next}{sub(/KEYWORD/,r)}1' replace.txt source.txt

如果您想从 replace.txt 中去除结尾的 \n:

awk -v RS="\0" -v ORS="" 'NR==FNR{r=$0;sub(/\n$/,"",r);next}{sub(/KEYWORD/,r)}1'  replace.txt source.txt

无论您的 replace.txt 是单行还是多行,以上行都有效。

例如:

kent$  head file1 file2                                                         
==> file1 <==
Hello
KEYWORD
Hi
KEYWORD

==> file2 <==
rep_line1
rep_line2

kent$  awk -v RS="\0" -v ORS="" 'NR==FNR{r=$0;next}{sub(/KEYWORD\n/,r)}1' file2 file1
Hello
rep_line1
rep_line2
Hi
KEYWORD

可以看到,只替换了file1中的第一个KEYWORD。但是 Awk 无法将更改写回输入文件。我们能做的是:

awk '...' replace.txt src.txt > /tmp/t.txt && mv /tmp/t.txt /path/to/src.txt

awk 单行代码是用 gawk 测试的。不保证它适用于所有 awk 实现。如果你有一个非 gnu awk,你应该测试它。

感谢 Ed Morton 的建议。

关于linux - 使用正则表达式修改文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16310500/

相关文章:

ruby-on-rails - Ruby - 在 tmp/pids/thin.pid (Thin::PidFileNotFound) 中找不到 PID

linux - 使用 csplit 将静态字符串作为 REGEXP 传递时遇到问题

javascript - 在html中读取上传的文本文件内容

c# - 如何写入资源文件?

linux - 在字符串中就地移位

linux - 更新 glibc 后 : Segmentation fault (core dumped)

linux - 使用 UNIX/Linux 命令管道和重定向列出文件

c++ - 从文件中读取对象并出现错误

bash - fish shell : how to exit on error (bash set -e)

linux - 显示命令的特定列