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?

Odpowiedzi:


20

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

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

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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.