首页 > 解决方案 > 如何在包含斜杠的匹配后更改单词

问题描述

在我的文件“input.txt”中,我写了以下路径:

"/home/inputfiles/water_gen/5202_water.gen"

我想通过特定数字(可能使用 for 循环)更改“5202”并将它们保存为不同的文件。

我认为最简单的方法是使用 sed 找到“water_gen/”作为匹配项,然后更改其余部分。

但是有没有更简单的方法?由于斜线,我一直遇到问题。

标签: bashsed

解决方案


这可能对您有用(GNU sed 和并行):

parallel --dry sed -E 's/[0-9]+/{1}/' {2} \> {2.}{1}.txt ::: {1000..1005} ::: file.txt

这将生成命令集以将第一组数字替换为file.txtto1000并将1005结果写入file1000.txtto file1005.txt

验证命令集后,删除选项的--dry缩写--dry-run 并重新运行。

注意原始文件没有改变。

替换可以更具体,即:

parallel sed -E \''s#(/home/inputfiles/water_gen/)5202(_water.gen)#\1{1}\2#'\' {2} \> {2.}{1}.txt ::: {1000..1005} ::: file.txt

注意 sed 命令引号被引用\',这样后面的引用就不会被误认为是 shell 中的东西。

或者,不太具体:

parallel sed -E \''s#(/home/inputfiles/water_gen/)[0-9]+(_water.gen)#\1{1}\2#'\' {2} \> {2.}{1}.txt ::: {1000..1005} ::: file.txt

替换号码可能在文件中:

cat <<\! > replacementsFile
1000
1001
1002
1003
1004
1005
!
parallel sed -E \''s#(/home/inputfiles/water_gen/)5202(_water.gen)#\1{1}\2#'\' {2} \> {2.}{1}.txt :::: replacementsFile ::: file.txt

推荐阅读