Suppression de texte entre deux chaînes spécifiques


10

J'ai un fichier comme ci-dessous:

mime PI Name: ISHO SUCCESS RATE RT, Value: 95.663826
scr  PI Name: RRC Access Failures due to UU, Value: 0.13394141
prog PI Name: RRC Access Failures due to UU, Value: 0.16077702
sch PI Name: RRC Access Failures due to UU, Value: 0.11781933

Je souhaite supprimer le texte PIjusqu'à Value:. j'ai essayé

sed '/<PI>/,/<\/Value:>/d' 

De l'aide?

Réponses:


20

Remplacez tout de PIà Value:avec une chaîne vide:

sed 's/PI.*Value://'

10
Est-ce que cela fonctionnera si PIet Value:se produit sur des lignes différentes?
Brian Fitzpatrick

6

L'utilisation de la dcommande dans sedsupprimera toute la ligne. De plus, je ne sais pas pourquoi vous utilisez <et >. Peut-être que vous les confondez \<et \>que cela grepsert à désigner les limites des mots? Dans ce cas, vous devez savoir que les sedutilisations \bpour les deux types de limites de mots (début et fin). Vous pouvez donc écrire quelque chose comme ceci:

sed -i 's/\bPI\b.*\bValue:\b//' your_file

Pour plus de robustesse, j'utiliserais perlpour la quantification paresseuse de .sorte que vous ne supprimiez que le texte entre la première occurrence de PIet la première occurrence de Value:. Bien sûr, tout dépend de votre cas d'utilisation.

perl -pi -e 's{ \b PI \b .*? \b Value: \b}{}x' your_file

1

Utilisez ce code ci-dessous pour supprimer plusieurs lignes entre les motifs (y compris les lignes avec des motifs):

sed "/PI/,/Value:/d" your_file

Si vous souhaitez modifier directement votre_fichier:

sed -i "/PI/,/Value:/d" your_file

Remarquez la distinction ici - cela supprime les lignes d'une plage, tandis que la question demande de supprimer du texte entre deux chaînes.
Jeff Schaller
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.