如何使用sed按行号替换同一文件中的第N行和第M行
how to use sed to replace the Nth line with the Mth line in the same file by line numbers
这是我的问题:
- 给定一个文本文件。
- 每行中的数据未知。
- 需要用第 5 行替换第 3 行。
- 要替换的行号和要替换的行号是给定的并且是常量。
- 行号永远不是第一行或最后一行。
- 文件中的行数没有改变
在 运行 代码之前
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个这样的进程运行ning。所以他们总是一起加变。
这是我到目前为止的想法:
注意:我添加了 -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
这是我的问题:
- 给定一个文本文件。
- 每行中的数据未知。
- 需要用第 5 行替换第 3 行。
- 要替换的行号和要替换的行号是给定的并且是常量。
- 行号永远不是第一行或最后一行。
- 文件中的行数没有改变
在 运行 代码之前
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个这样的进程运行ning。所以他们总是一起加变。
这是我到目前为止的想法:
注意:我添加了 -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