【问题标题】:how to use sed to replace the Nth line with the Mth line in the same file by line numbers如何使用sed通过行号将同一文件中的第N行替换为第M行
【发布时间】:2020-01-27 13:39:35
【问题描述】:

这是我的问题:

  • 给定一个文本文件。
  • 每行中的数据未知。
  • 需要将第 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

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

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

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

我也尝试了各种替换方法,但结果更糟。

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

总之,我一无所知。

更新

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

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

  • 我正在运行 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 要求我从命令中删除 ',并且可能会添加行而不是覆盖。它在 power shell 中运行良好,但我是否需要制作一个 .bat 文件以在 power shell 上运行?

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

【问题讨论】:

  • 使用编辑器正确标记代码和数据({} 键或前置 4 个空格),就像现在一样,阅读起来很混乱。另外,发布一些具有预期输出的示例数据。
  • 谢谢。抱歉,这是我在这里的第一条消息,我完全不确定如何使用论坛或代码...我确实觉得我发布了具有预期输出的示例数据,不是吗?有人帮我修好了。所以谢谢你,我会在下一篇文章中做得更好

标签: sed replace line


【解决方案1】:

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

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 行

如果要替换的线和替换的线之间有多于一条线,例如。 G。分别在 3 和 7 之间,我们需要一个额外的命令来附加行:

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

【讨论】:

  • 谢谢,但我现在将在这里更新,我需要切换超过 1 行,并且行之间有超过 1 个空格
【解决方案2】:

这可能对你有用(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

【讨论】:

  • 嗨波东!非常感谢!第一个选项对我不起作用。您的替代方案确实有效,但我有一些事情想看看您是否可以帮助我。你能检查我的问题的更新吗?在顶部?谢谢!
猜你喜欢
  • 2018-04-14
  • 2021-12-28
  • 2021-10-18
  • 2017-12-20
  • 1970-01-01
  • 2021-11-12
  • 2022-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多