bash捕获模式的特定实例并排除其他实例

时间:2018-10-11 13:22:15

标签: bash awk sed grep

我试图捕获Option Compare Text Private Sub TextBox1_Change() Application.ScreenUpdating = False Range("E8:E30").Interior.ColorIndex = 24 If TextBox1 <> "" Then For ligne = 8 To 30 If Cells(ligne, 5) Like "*" & TextBox1 & "*" Then Cells(ligne, 5).Interior.ColorIndex = 43 End If Next End If End Sub 中仅有$line的一行并将其读入file(第2行是一个示例)。第3行中有del,但也有delins,当前执行时会捕获两者。我不确定如何排除bash以外的任何内容,而只捕获那些行。谢谢:)。

文件

del

所需的输出

NM_003924.3:c.765_779dupGGCAGCGGCGGCAGC
NM_003924.3:c.765_779delGGCAGCGGCGGCAGC
NM_003924.3:c.765_779delGGCAGCinsGGCGGCAGC
NM_003924.3:c.765_779insGGCAGCGGCGGCAGC

带有当前输出的重击

NM_003924.3:c.765_779delGGCAGCGGCGGCAGC

5 个答案:

答案 0 :(得分:2)

请尝试以下操作(如果可以使用awk,则可以)。

awk '/del/ && !/ins/'  Input_file

答案 1 :(得分:1)

尝试:

while read -r line; do
    [[ $line =~ del && ! $line =~ ins ]] && printf '%s\n' "$line"
done < file

修改后的代码也是ShellCheck干净的,避免使用BashPitfall #14

如果文件的最后一行没有终止换行符,则此解决方案可能会失败。如果这是一个问题,请参见Read last line of file in bash script when reading file line by line的可接受答案以获取修复。

答案 2 :(得分:1)

分为2个步骤。您不需要循环:

grep "del" file | grep -v "ins"

答案 3 :(得分:1)

这是一个sed解决方案。它会否定匹配项del后跟ins,并打印其中包含del的所有内容。 -n使所有其他输出静音。

$ sed -n -e '/del.*ins/!{/.*del.*/p}' inputFile
NM_003924.3:c.765_779delGGCAGCGGCGGCAGC

答案 4 :(得分:1)

这是使用启用了PCRE的grep的另一个答案。这应该与-P

中的GNU grep选项一起使用
$ grep -P 'del\.*(?!.*ins)' inputFile
NM_003924.3:c.765_779delGGCAGCGGCGGCAGC