使用/通过路径模式更改模式

时间:2019-01-12 11:57:44

标签: bash awk sed

我有一个file.txt,其中包含很多行,例如::

blastdbcmd -db /path/path/LO/db_lh/makedb_KO -entry scaffold_2731 -range 32270-32509-strand minus >> file.fst
blastdbcmd -db /path/path/LO/db_lh/makedb_lKO -entry scaffold_2781 -range 3230-3508-strand minus >> file.fst
etc.

我想用file.fst替换所有path/data/path/LO/file.txt模式

然后得到:

blastdbcmd -db /path/path/LO/db_lh/makedb_KO -entry scaffold_2731 -range 32270-32509-strand minus >> path/data/path/LO/file.txt
blastdbcmd -db /path/path/LO/db_lh/makedb_lKO -entry scaffold_2781 -range 3230-3508-strand minus >> path/data/path/LO/file.txt

etc.

它尝试过:

sed -i -e 's/file.fst/path/data/path/LO/file.txt/g' /path/path/file_script_recover_copie.txt

但是它不起作用,有人有更好的主意吗?谢谢。

2 个答案:

答案 0 :(得分:2)

备份文件,然后尝试以下操作:

sed -i -e 's@file.fst@path/data/path/LO/file.txt@g' /path/path/file_script_recover_copie.txt

例如:

$ cat file
blastdbcmd -db /path/path/LO/db_lh/makedb_KO -entry scaffold_2731 -range 32270-32509-strand minus >> file.fst
blastdbcmd -db /path/path/LO/db_lh/makedb_lKO -entry scaffold_2781 -range 3230-3508-strand minus >> file.fst
etc.

$ sed -e 's@file.fst@path/data/path/LO/file.txt@g' file
blastdbcmd -db /path/path/LO/db_lh/makedb_KO -entry scaffold_2731 -range 32270-32509-strand minus >> path/data/path/LO/file.txt
blastdbcmd -db /path/path/LO/db_lh/makedb_lKO -entry scaffold_2781 -range 3230-3508-strand minus >> path/data/path/LO/file.txt
etc.

问题是因为替换项中有/,其中/也是sed的{​​{1}}分隔符。但是s可以使用其他字符作为sed的定界符。所以我将其更改为s
(您也可以使用其他人,只要他们在正确的位置即可)

另一种方法是通过在@前面加上/来逃逸\,因此在s内部,它们变成\/. (This applies to other special characters too, for example to use'you can put \'`。)

答案 1 :(得分:1)

如果您对awk表示满意,则可以尝试关注。

awk -v val="path/data/path/LO/file.txt" '{sub("file.fst",val)} 1' Input_file

将路径的值传递到-v val的{​​{1}}变量,然后它应该起作用。

使用awk来防止定界符保留为sed本身,然后尝试执行以下操作。(我在/解决方案中转义了\/,因此不会考虑它因为它用于关闭sed的代码段)

sed