Usuwanie tekstu między dwoma konkretnymi ciągami

10

Mam plik jak poniżej:

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

Chcę usunąć tekst PIdo Value:. próbowałem

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

Jakaś pomoc?

khalil saad
źródło

Odpowiedzi:

20

Zastąp wszystko od PIdo Value:pustym ciągiem:

sed 's/PI.*Value://'
Danadam
źródło
10
Będzie to działać, jeśli PIi Value:występują na różnych liniach?
Brian Fitzpatrick
6

Użycie dpolecenia w sedspowoduje usunięcie całej linii. Nie jestem też pewien, dlaczego używasz <i >. Być może mylisz je, \<a \>to grepoznacza granice słów? W takim przypadku powinieneś wiedzieć, że sedużywa \bobu rodzajów granic słów (początku i końca). Możesz więc napisać coś takiego:

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

Dla dodatkowej niezawodności użyłbym perldo leniwej kwantyfikacji ., aby usunąć tekst tylko między pierwszym wystąpieniem PIa pierwszym wystąpieniem Value:. Oczywiście wszystko zależy od twojego przypadku użycia.

perl -pi -e 's{ \b PI \b .*? \b Value: \b}{}x' your_file
Joseph R.
źródło
1

Użyj poniższego kodu, aby usunąć wiele linii między wzorami (w tym linie ze wzorami):

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

Jeśli chcesz bezpośrednio zmodyfikować swój plik:

sed -i "/PI/,/Value:/d" your_file
Feriman
źródło
Zauważ tutaj różnicę - powoduje to usunięcie linii w zakresie, podczas gdy pytanie wymaga usunięcia tekstu między dwoma łańcuchami.
Jeff Schaller