如何使用sed按行号将同一文件中的第n行替换为第m行

如何使用sed按行号将同一文件中的第n行替换为第m行,sed,replace,line,Sed,Replace,Line,我的问题是: 给定一个文本文件 每行中的数据都是未知的 需要将第3行更换为第5行 要替换的行号和要替换的行号是给定的,并且是常量 行号永远不是第一行或最后一行 文件中的行数不变 在运行代码之前 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行更换为第5行
  • 要替换的行号和要替换的行号是给定的,并且是常量
  • 行号永远不是第一行或最后一行
  • 文件中的行数不变
在运行代码之前

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
在运行代码之后

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
简言之,我一无所知

更新 Poton的第一个解决方案对我不起作用,但另一个解决方案对我起作用。我现在有一个问题

所以情况是这样的——我不得不一直重复一个非常烦人的过程。没有太多涉及:

  • 我正在运行Windows
  • 我有一个包含进程Id号的文本文件,每个编号下都有属于特定进程的设置
  • 每次重新启动进程时,进程ID都会更改
  • 进程新ID自动写入txt文件
  • 我没有从头开始设置进程设置,而是简单地复制新的随机生成的进程ID号,然后删除现在只是垃圾的设置数据
  • 有4个这样的进程同时运行。因此,它们总是一起添加和更改
以下是我到目前为止的想法:

注意:我添加了-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要求我从命令中删除',并且可能会添加行而不是覆盖。它在PowerShell中运行得很好,但我是否需要制作一个.bat文件来在PowerShell上运行呢


我想在末尾添加一个命令,删除第60行及以后的所有内容。我该怎么做

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

sed '3d;4{h;d};5{p;x;p;x}' file1.txt >file2.txt
  • 3d
    :删除第3行
  • 4{h;d}
    :复制第4行以保留空间;删除第4行(暂时删除)
  • 5{p;x;p;x}
    :打印行5(成为输出行3);交换持有和模式空间;打印先前保留的第4行;重新交换第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):

使用
e
命令在sed中计算sed

备选方案:

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

使用编辑器正确地标记代码和数据(
{}
键或用4个空格作为前缀),就像现在一样,阅读起来相当混乱。另外,发布一些具有预期输出的示例数据。谢谢。抱歉,这是我在这里的第一条信息,我根本不知道如何使用论坛或代码。。。我确实觉得我发布了预期输出的样本数据,不是吗?有人帮我修好了。所以,谢谢你,我会在下一次博世博通中做得更好!非常感谢!第一种选择对我不起作用。你的选择确实有效,但我有一些事情我想看看,如果你能帮助我,请。你能检查一下我问题的更新吗?在顶端?非常感谢。谢谢你,但我会在这里更新,现在我需要切换超过1行,这些行之间有超过1个空间