Exemplo, eu tenho um arquivo com o seguinte conteúdo:
eggs
bacon
cereal
eggs
bacon
cheese
cereal
Saída:
eggs
bacon
cereal
No exemplo, desejo excluir linhas entre as palavras eggs
e cereal
, mas somente se ela contiver cheese
entre elas.
Como eu poderia fazer isso usando sed
?
Pediram para ser mais específico, então aqui está basicamente o que eu quero fazer, e espero que isso torne isso mais claro:
WeaponData
{
TextureData
{
"crosshair"
{
"file" "vgui/replay/thumbnails/"
"x" "0"
"y" "0"
"width" "64"
"height" "64"
}
"weapon"
{
"file" "sprites/bucket_bat_red"
"x" "0"
"y" "0"
"width" "200"
"height" "128"
}
"weapon_s"
{
"file" "sprites/bucket_bat_blue"
"x" "0"
"y" "0"
"width" "200"
"height" "128"
}
"ammo"
{
"file" "sprites/a_icons1"
"x" "55"
"height" "15"
}
"crosshair"
{
"file" "sprites/crosshairs" <---
"x" "32"
"y" "32"
"width" "32"
"height" "32"
}
"autoaim"
{
"file" "sprites/crosshairs"
"x" "0"
"y" "48"
"width" "24"
"height" "24"
}
}
}
Este é o comando que tentei:
sed '/"crosshair"/,/}/d' file.txt
Esse comando apenas exclui do primeiro "crosshair"
para o último }
, independentemente de ter a linha "sprites/crosshairs"
entre ou não.
Eu só quero excluir de "crosshair"
to }
se entre os padrões, a string "sprites/crosshairs"
for encontrada.
No entanto, existem outros blocos de código no arquivo de texto contendo "sprites/crosshairs"
.
Como:
"autoaim"
{
"file" "sprites/crosshairs"
"x" "0"
"y" "48"
"width" "24"
"height" "24"
}
Isso não pode ser removido. Eu peço desculpas por não ter explicado isso antes, mas não achei que fosse necessário.
A sugestão de don_crissti funciona muito bem, o que é sed '/crosshair/,/\}/{H;/\}/!d;s/.*//;x;/sprites\/crosshairs/d;s/.//;}' infile
A saída é esta, no entanto:
...
"autoaim"
{
}
}
"autoaim"
foi parcialmente excluído, mas não completamente, mas como você pode ver, o bloco contendo "sprites/crosshairs"
foi removido, como eu queria, mas autoaim
ainda não pode ser modificado