如何使用sed按行号替换同一文件中的第N行和第M行

how to use sed to replace the Nth line with the Mth line in the same file by line numbers

这是我的问题:

在 运行 代码之前

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(.*))//}' config.txt
.\sed -E -i '36{:a;N;64!ba;s/[^\n]*(.*\n(.*))//}' config.txt
.\sed -E -i '44{:a;N;68!ba;s/[^\n]*(.*\n(.*))//}' config.txt
.\sed -E -i '52{:a;N;72!ba;s/[^\n]*(.*\n(.*))//}' config.txt

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

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

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

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

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

对于给定的示例,您可以使用:

sed '3d;4{h;d};5{p;x;p;x}' file1.txt >file2.txt
  • 3d: 删除第 3 行
  • 4{h;d}:复制第4行保留space;删除第 4 行(暂时)
  • 5{p;x;p;x}:打印第5行(成为输出第3行);交换持有和模式 space;打印之前保存的第4行;重新交换保持和模式 space 以自动打印第 5 行

如果待替换行和替换行之间有不止一行,e。 G。 3 和 7,我们需要一个额外的命令来附加行:

sed '3d;4{h;d};5,6{H;d};7{p;x;p;x}' file1.txt >file2.txt

这可能适合您 (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(.*))//}' file