Mam plik, który składa się z kilku wierszy tekstu:
The first line
The second line
The third line
The fourth line
Mam ciąg, który jest jedną z linii: The second line
Chcę usunąć ciąg i wszystkie wiersze po nim w pliku, więc usunie The third line
i The fourth line
oprócz ciągu. Plik stałby się:
The first line
Szukałem rozwiązania w google i wydaje mi się, że powinienem skorzystać sed
. Coś jak:
sed 'linenum,$d' file
Ale jak znaleźć numer wiersza łańcucha? Albo jak inaczej mam to zrobić?
Odpowiedzi:
Jeśli nie chcesz drukować dopasowanej linii (lub dowolnych następujących):
sed -n '/The second line/q;p' inputfile
To mówi "kiedy dojdziesz do linii, która pasuje do wzorca zakończ, w przeciwnym razie wypisz każdą linię". Ta
-n
opcja zapobiega niejawnemu drukowaniu, ap
polecenie jest wymagane do jawnego drukowania wierszy.lub
sed '/The second line/,$d' inputfile
To mówi „usuń wszystkie wiersze z wyjścia, zaczynając od dopasowanej linii i kontynuując do końca pliku”.
ale pierwszy jest szybszy. Jednak zakończy przetwarzanie całkowicie, więc jeśli masz wiele plików jako argumenty, te po pierwszym pasującym pliku nie zostaną przetworzone. W takim przypadku formularz usuwania jest lepszy.
Jeśli chcesz wydrukować dopasowaną linię, ale nie wszystkie następujące wiersze:
sed '/The second line/q' inputfile
To mówi "wypisz wszystkie linie i zakończ, gdy dopasowana linia zostanie osiągnięta" (
-n
opcja (brak niejawnego drukowania) nie jest używana).Dodatkowe informacje można znaleźć w man sed .
źródło
co -p
na przykład RCS ), a wtedy lepiej jest zsed '/The second line/,$d'
notacją.p
po;
pracach.To trochę krócej niż inne podane rozwiązania. Zakończ, używając dużego Q, aby uniknąć drukowania bieżącej linii.
sed '/The second line/Q' file
Aby faktycznie usunąć wiersze, możesz użyć tej samej składni.
sed -i '/The second line/Q' file
źródło
sed '/The second line/q0' file
Lub bez gnu sed:
sed '/The second line/q' file
Lub używając grep:
grep -B 9999999 "The second line"
źródło
sed "/$string/,\$d" inputfile
.Korzystanie z awk (bez pokazywania dopasowanej linii)
awk '/pattern/ {exit} {print}' file.txt
źródło
Najpierw dodaj numer linii i usuń linię
cat new.txt The first line The second line The third line The fourth line cat new.txt | nl 1 The first line 2 The second line 3 The third line 4 The fourth line cat new.txt | nl | sed "/2/d" 1 The first line 3 The third line 4 The fourth line cat new.txt | nl |sed "3d;4d" 1 The first line 2 The second line
używając awk
awk 'NR!=3 && NR!=4' new.txt The first line The second line
źródło
awk '/The second line/{exit}1' file
źródło