2015-05-22 19 views
5

Mam plik z poniższej informacjipoleceń do wstawienia linii przed pierwszym meczem

testing 
testing 
testing 

chcę wstawić słowo (testowane) przed pierwszym testowym słowo za pomocą polecenia sed lub dowolny Linux

potrzebę get wyjście jak

tested 
testing 
testing 
testing 

Dzięki

+1

@ mklement0: Tak widziałem go później. Chyba dlatego nie czytałem pytań o czwartej nad ranem :). Mój błąd. Dzięki! –

Odpowiedz

4

dokładniej:

sed '0,/testing/s/testing/tested\n&/' file 

linii zawierających "testowanie":

sed '0,/.*testing.*/s/.*testing.*/tested\n&/' file 

Dla linii, począwszy od "testowanie"

sed '0,/^testing.*/s/^testing.*/tested\n&/' file 

Fo R linie kończące się na "testing":

sed '0,/.*testing$/s/.*testing$/tested\n&/' file 

Aby zaktualizować zawartość pliku z wynikiem dodać "-i", przykład:

sed -i '0,/testing/s/testing/tested\n&/' file 
6

To może pracować dla Ciebie (GNU sed):

sed -e '/testing/{itested' -e ':a;n;ba}' file 

Insert tested przed pierwszym meczu testing a następnie użyć pętli odczytać/wydrukować pozostałą część pliku.

Albo użyć specyficznych GNU:

sed '0,/testing/itested' file 
5

zapewnienie awk opartych alternatywę, która jest łatwiejsza do zrozumienia:

awk '!found && /testing/ { print "tested"; found=1 } 1' file 
  • found służy do śledzenia czy pierwszej instancji z testing został znaleziony (zmienna found, jak każda zmienna Awk, domyślnie jest to 0, tj. false w kontekście Boolean).
  • /testing/ zatem odpowiada linii pierwszy zawierający testing i przetwarza posiada bloku:
    • { print "tested"; found=1 } drukuje się pożądany tekst i ustawia flagę pierwszy testing linia znaleziono
  • 1 jest wspólny skrót dla { print }, tj. po prostu drukowanie bieżącej linii wejściowej bez zmian.