如何打印由sed / awk更改的行号

3

能否使用sed打印已更改的行号和行内容?

我只需要进行简单的文本替换,无需使用正则表达式:

sed -i "s:replace_me:replaced:" test.c

我需要用它来编写一个Bash脚本。

提前感谢!


[tag:awk]可以吗?请注意,[tag:sed]无法打印此信息,因为它会出现在输入文件中。我知道你使用-i,但内部它会输出到临时文件并将其移回原始文件。 - ShellFish
当然可以丑陋一些,我只是想确认更改的行数和最好包括行内容。感谢您的帮助。 - 5andr0
只需执行两次,一次输出到标准输出,一次原地操作。或者在操作之前备份文件,并在操作后使用 diff 进行比较。 - mckenzm
2个回答

2

你可以有几种选择:

vim

使用文本编辑器,您可以交互地替换模式,编辑器会在每次替换之前提示。因此,您可以针对每种情况选择yn

$ vim file
:%s/pattern/replace/gc

diff

使用diff命令,您可以轻松比较两个文件并查看更改:

$ sed 's/pattern/replace/g' file > tmpfile
$ diff -u file tmpfile

或者

$ diff -y file tmpfile

尝试使用man diff来进行其他有趣的可视化操作。

当你确信一切都没问题后,执行以下操作:

$ mv tmpfile file

如果这还不够,我可以编写一个 [tag:awk] 脚本来执行替换操作,并将信息存储到日志文件中。 - ShellFish

0

这是一个 POSIX 的扩展,但 cat -n file.txt | ... 是添加行号的优雅解决方案。

你可以尝试使用 sed 创建更新后的文件,将原始文件和更新后的文件都通过 cat -n 写入临时文件,然后比较两个文件的差异 diff -q

另一种方法是类似于 cat -n original.txt | sed -n 's/[ 0-9]{7} .*pattern.*/replacement/gp。你需要运行两次替换,但当你对原始文件和更新后的文件进行编号和 diff 比较时,唯一的优点可能是 diff 可能被认为是更传统的技术。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接