我有一个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
但是它不起作用,有人有更好的主意吗?谢谢。
答案 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