首页 > 解决方案 > 如何使用sed通过行号将同一文件中的第N行替换为第M行

问题描述

这是我的问题:

在运行代码之前

A34JC
P1@%NWA]
MM1              //Line to be replaced
M@K(FD
BWKD             //Line to replace with
Z

运行代码后

A34JC
P1@%NWA]
BWKD             //Data in Line 3 was replaced with the data from line 5
M@K(FD
BWKD
Z

我真的不介意使用 shell、sed(或 awk,虽然我不熟悉)。从我在这里看到的我尝试了以下

sed 3s/.*/???/ file1.txt > file2.txt

我很尴尬地说我在???. 我知道我可以在那里手动插入文本,但问题是我不知道第 5 行包含什么数据。

我也尝试了各种替代方式,但情况更糟。

sed 3d;5r file1.txt file1.txt > file2

简而言之,我一无所知。

更新

Potong 的第一个解决方案对我不起作用,但替代工作。我现在有一个继续的问题。

所以情况是这样的——我不得不一直重复一个非常烦人的过程。无需过多介绍:

这是我到目前为止的想法:

注意:我添加了 -i 以保存对同一文件所做的更改

.\sed -E -i '28{:a;N;60!ba;s/[^\n]*(.*\n(.*))/\2\1/}' config.txt
.\sed -E -i '36{:a;N;64!ba;s/[^\n]*(.*\n(.*))/\2\1/}' config.txt
.\sed -E -i '44{:a;N;68!ba;s/[^\n]*(.*\n(.*))/\2\1/}' config.txt
.\sed -E -i '52{:a;N;72!ba;s/[^\n]*(.*\n(.*))/\2\1/}' config.txt

可以看到 28,36,44,52 和 60,64,68,72 是系列。

这是我需要更多帮助的地方:

我想自动运行所有 4 个命令,例如作为 .bat 文件或类似文件。它可以使用 .bat 文件工作吗?

我知道 cmd 要求我从命令中删除 ' ,并且可以添加行而不是覆盖。它在 power shell 中运行良好,但显示我是否制作了一个 .bat 文件以在 power shell 上运行?

我想在最后添加一个命令来删除第 60 行及以后的所有内容。我怎么做?

标签: sedreplaceline

解决方案


这可能对您有用(GNU sed):

sed -e '3{e sed -n "5p" file' -e 'd}' file

e使用命令在 sed 中评估 sed 。

选择:

sed -E '3{:a;N;5!ba;s/[^\n]*(.*\n(.*))/\2\1/}' file

推荐阅读