sed - 如何使用sed通过行号将同一文件中的第N行替换为第M行
问题描述
这是我的问题:
- 给定一个文本文件。
- 每行中的数据是未知的。
- 需要将第 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 行及以后的所有内容。我怎么做?
解决方案
这可能对您有用(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
推荐阅读
- javascript - 单击按钮时某些表单输入被清除
- php - VSC 中的 phpfmt 格式化程序将类型放在类成员声明中的访问修饰符之前
- c# - unity text URL 添加额外字符
- javascript - 在启用了 --kiosk-printing 的 chrome 中使用 printJS 打印 pdf 总是失败
- javascript - 使用 Service-Worker React 的离线页面
- r - 如何在 r 中查看交叉验证的重采样数据?
- java - MiniKdc 无法从 org.springframework.security.kerberos.test.MiniKdc 获得
- azure - 名称或服务未知 - Azure 中的间歇性错误
- react-native - React Native 菱形按钮网格
- java - Java中对象内的自动过期字段