使用带变量的 sed 命令

使用带变量的 sed 命令

我想删除所有包含某个字符串的行以及接下来的 3 行。

当使用单个字符串时,我可以使用 sed 命令轻松完成此操作:

sed '/HISEQ:243:C9FH7ANXX:4:2202:4922:44902/,+3 d' ../input/infile.fq_1 > ../output/outfile.fq_1

双引号版本同样有效:

sed "/HISEQ:243:C9FH7ANXX:4:2202:4922:44902/,+3 d" ../input/infile.fq_1 > ../output/outfile.fq_1

但是,我想使用许多字符串。每个字符串都是名为 strings.txt 的文本文件中的一行,我想一次匹配一个字符串,每次删除输入文件中匹配的行以及接下来的 3 行,并将输出写入输出文件。

所以我尝试过:

cat strings.txt | while read LINE
do
sed '/$LINE/,+3 d' ../input/infile.fq_1 > ../output/outfile.fq_1
done

但是使用单引号时无法识别该变量。如果我使用双引号:

cat strings.txt | while read LINE
do
sed "/$LINE/,+3 d" ../input/infile.fq_1 > ../output/outfile.fq_1
done

这也不起作用。

我也尝试了各种变化,例如使用花括号或使用两种类型的引号:

cat strings.txt | while read LINE
do
sed '/'"$LINE"'/,+3 d' ../input/infile.fq_1 > ../output/outfile.fq_1
done

但似乎没有什么效果。非常感谢您的帮助!

答案1

这里的问题是,每次循环时,你都要重写输出文件。试试这个:

#!/bin/bash

cp ../input/infile.fg_1 temp

while read line; do
   sed -i "/$line/,+3 d" temp
done < strings.txt

mv temp ../output/outfile.fg_1

sed 命令中的 -i 将每个更改添加到临时文件,然后在完成所有更改后,将其移动到输出文件。如果您想直接在输出文件上工作,请执行以下操作:

#!/bin/bash

cp ../input/infile.fg_1 ../output/outfile.fg_1

while read line; do
   sed -i "/$line/,+3 d" ../output/outfile.fg_1
done < strings.txt

相关内容