Question

J'ai un fichier dont le contenu est comme celui-ci:

control_data {
some data dadadadf 
some data fsfsfs
some more data
.
.
.
}
more data below 
{
.
.
}

Je veux supprimer les données de "contrôler_data" à la première "}"

J'ai essayé une commande

sed "s/control_data\([^}]*\)}//g"

Mais cela ne fonctionne que si nous n'avons pas de lignes multiples, par exemple.Cette commande fonctionne lorsque nous avons des données comme:

control_data {some data dadadadf some data fsfsfs some more data...}more data

Il donne:

more data {....} 

Comment faire fonctionner cette commande lorsque nous avons des données sur plusieurs lignes? Je suis nouveau dans Shell Scripting Certaines explications avec la réponse contribueront grandement à aider.

Merci d'avance.

Était-ce utile?

La solution

Celui-ci peut ne pas être un idéal, mais celui-ci utilisé SED (votre code SED)

cat ip_file.txt | tr '\n' ':' | sed "s/control_data\([^}]*\)}//g" | tr ':' '\n'

logique: je convertissez toutes les nouvelles lignes à:, puis en utilisant votre code SED, puis convertissant tout: aux lignes neuves Remarque: mon hypothèse est la suivante: ne sera pas présent dans le fichier n'importe où.

Autres conseils

My Sed-Fu est faible, mais voici ce que j'ai eu de travail (en utilisant Cette réponse comme guide):

[me@home]$ sed -n '/^control_data {/{:a;n;/^}/!ba;n};p' input_file.txt
more data below 
{
.
.
}

Voici une ventilation de la commande

sed -n "             # "-n" = suppress automatic printing of pattern space
/^control_data {/ {  # if (line matches control data)
   :a;                 #   mark this spot with label a
   n;                  #   get next line
   /^}/!ba             #   if (doesn't start with "}") go back to label a
   n;                  #   get next line before leaving this control block
};                   # end if
p;                   # print everything else not affected by previous block
" input_file.txt

Cela pourrait fonctionner pour vous:

sed '/^control_data {.*}$/d;/^control_data {/,/^}$/d' file

  • La première commande supprime toutes les lignes simples /^control_data {.*}$/d
  • La deuxième commande supprime tous les blocs /^control_data {/,/^}$/d
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top