czy usunięcie wiersza w miejscu na pełnym systemie plików?

11

Ze względu na nierozpoznany błąd aplikacji mam kilkaset serwerów z pełnym dyskiem. Istnieje jeden plik, który został wypełniony zduplikowanymi wierszami - nie plik dziennika, ale plik środowiska użytkownika ze zmiennymi definicjami (więc nie mogę po prostu usunąć pliku).

Napisałem proste sedpolecenie, aby sprawdzić błędnie dodane wiersze i je usunąć, i przetestowałem je na lokalnej kopii pliku. Działa zgodnie z przeznaczeniem.

Jednak gdy wypróbowałem go na serwerze z pełnym dyskiem, otrzymałem w przybliżeniu następujący błąd (pochodzi z pamięci, nie kopiuj i wklej):

sed: couldn't flush /path/to/file/sed8923ABC: No space left on deviceServerHostname

Oczywiście wiem, że nie ma już miejsca. Dlatego próbuję usunąć rzeczy! ( sedPolecenie, którego używam, zmniejszy plik linii 4000+ do około 90 linii.)

Moje sedpolecenie jest słusznesed -i '/myregex/d' /path/to/file/filename

Czy istnieje sposób na zastosowanie tego polecenia pomimo pełnego dysku?

(Musi być zautomatyzowany, ponieważ muszę go zastosować na kilkuset serwerach jako szybką poprawkę).

(Oczywiście błąd aplikacji musi zostać zdiagnozowany, ale w międzyczasie serwery nie działają poprawnie ....)


Aktualizacja: Sytuacja, z którą się spotkałem, została rozwiązana poprzez usunięcie czegoś innego, co, jak się okazało, mogę usunąć, ale nadal chciałbym uzyskać odpowiedź na to pytanie, które byłoby pomocne w przyszłości i dla innych osób.

/tmpjest zakazem; jest w tym samym systemie plików.

Przed zwolnieniem miejsca na dysku przetestowałem i okazało się, że mogę usunąć wiersze vi, otwierając plik i uruchamiając, :g/myregex/da następnie z powodzeniem zapisując zmiany za pomocą :wq. Wydaje się, że powinno być możliwe zautomatyzowanie tego, bez uciekania się do osobnego systemu plików do przechowywania pliku tymczasowego .... (?)

Dzika karta
źródło
1
sed -itworzy tymczasową kopię do działania. Podejrzewam, że tak edbyłoby lepiej, choć nie jestem wystarczająco znajomy, aby zakazać rzeczywistego rozwiązania
Eric Renouf,
2
Z eduruchomionym: printf %s\\n g/myregex/d w q | ed -s infilepamiętaj jednak, że niektóre implementacje używają również plików tymczasowych tak jak sed(możesz spróbować busyboksa ed - afaik nie tworzy pliku tymczasowego)
don_crissti
1
@Wildcard - niezawodnie w / echo. użyć printf. i seddodaj znak, który upuścisz w ostatnim wierszu, aby uniknąć utraty spacji końcowych. Ponadto twoja powłoka musi być w stanie obsłużyć cały plik w jednym wierszu poleceń. to twoje ryzyko - najpierw przetestuj. bashjest w tym szczególnie niedobry (myślę, że ma to do czynienia z miejscem na stosie?) i może cię w każdej chwili zranić. te dwa sedzalecane przynajmniej wykorzystałyby bufor potoku jądra, aby uzyskać dobry efekt między nimi, ale metoda jest dość podobna. twoje polecenie podrzędne również obetnie, fileczy sed w / in zakończy się powodzeniem.
mikeserv
1
@Wildcard - spróbuj sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}i jeśli działa, przeczytaj resztę mojej odpowiedzi.
mikeserv

Odpowiedzi:

10

Ta -iopcja nie zastępuje oryginalnego pliku. Tworzy nowy plik z danymi wyjściowymi, a następnie zmienia nazwę na oryginalną nazwę pliku. Ponieważ nie masz miejsca w systemie plików dla tego nowego pliku, nie działa.

Musisz to zrobić sam w skrypcie, ale utwórz nowy plik w innym systemie plików.

Ponadto, jeśli tylko usuwasz wiersze pasujące do wyrażenia regularnego, możesz użyć grepzamiast sed.

grep -v 'myregex' /path/to/filename > /tmp/filename && mv /tmp/filename /path/to/filename

Zasadniczo programy rzadko używają tego samego pliku jako danych wejściowych i wyjściowych - gdy tylko zacznie zapisywać do pliku, część programu, która czyta z pliku, nie będzie już widzieć oryginalnej zawartości. Więc albo najpierw musi skopiować gdzieś oryginalny plik, albo napisz do nowego pliku i zmień jego nazwę po zakończeniu.

Jeśli nie chcesz używać pliku tymczasowego, możesz spróbować buforować zawartość pliku w pamięci:

file=$(< /path/to/filename)
echo "$file" | grep -v 'myregex' > /path/to/filename
Barmar
źródło
1
Czy zachowuje uprawnienia, własność i znaczniki czasu? Może rsync -a --no-owner --no-group --remove-source-files "$backupfile" "$destination"od tutaj
Hastur
@Hastur - masz na myśli sugerowanie, że sed -izachowuje to?
mikeserv
2
@Hastur sed -inie zachowuje żadnej z tych rzeczy. Właśnie wypróbowałem go z plikiem, którego nie posiadam, ale znajduje się w katalogu, który posiadam, i pozwala mi to wymienić plik. Zastąpienie jest własnością mnie, a nie pierwotnego właściciela.
Barmar
1
@ RalphRönnquist Aby mieć pewność, musisz to zrobić w dwóch krokach:var=$(< FILE); echo "$FILE" | grep '^"' > FILE
Barmar
1
@Barmar - nie działa - nie wiesz nawet, że pomyślnie otworzyłeś wejście. Bardzo najmniej można zrobić, to v=$(<file)&& printf %s\\n "$v" >filejednak nawet nie używać &&. Pytający mówi o uruchomieniu go w skrypcie - zautomatyzowaniu nadpisywania pliku jego częścią. powinieneś przynajmniej sprawdzić, czy możesz pomyślnie otworzyć dane wejściowe i wyjściowe. Powłoka może również eksplodować.
mikeserv,
4

Tak to seddziała. W przypadku użycia z -iedycją sedlokalną tworzy plik tymczasowy z nową zawartością przetwarzanego pliku. Po zakończeniu sedzastępuje bieżący plik roboczy tymczasowym. Narzędzie nie edytuje pliku na miejscu . To jest dokładnie zachowanie każdego edytora.

To tak, jakbyś wykonał następujące zadanie w powłoce:

sed 'whatever' file >tmp_file
mv tmp_file file

W tym momencie sedpróbuje opróżnić buforowane dane do pliku wymienionego w komunikacie o błędzie za pomocą fflush()wywołania systemowego:

W przypadku strumieni wyjściowych fflush()wymusza zapis wszystkich danych buforowanych w przestrzeni użytkownika dla danego strumienia wyjściowego lub aktualizacji za pośrednictwem podstawowej funkcji zapisu strumienia.


W przypadku twojego problemu widzę rozwiązanie polegające na zamontowaniu oddzielnego systemu plików (na przykład tmpfs, jeśli masz wystarczającą ilość pamięci lub zewnętrznego urządzenia pamięci masowej) i przeniesienie tam niektórych plików, przetworzenie ich tam i przeniesienie ich z powrotem.

chaos
źródło
3

Od czasu opublikowania tego pytania nauczyłem się, że exjest to program zgodny z POSIX. Jest prawie uniwersalnie dowiązany do vim, ale tak czy inaczej, poniżej (według mnie) kluczowym zagadnieniem exzwiązanym z systemami plików (wziętymi ze specyfikacji POSIX):

W tej sekcji zastosowano termin „ bufor edycji” do opisania bieżącego tekstu roboczego. Termin ten nie implikuje żadnej konkretnej implementacji. Wszystkie zmiany edycyjne są wykonywane w buforze edycyjnym i żadne zmiany nie wpłyną na żaden plik, dopóki plik edytora nie zapisze pliku.

„... wpływa na każdy plik ...” Wierzę, że umieszczenie czegoś w systemie plików (w ogóle nawet pliku tymczasowego) liczyłoby się jako „wpływające na dowolny plik”. Może?*

Dokładne przestudiowanie specyfikacji POSIX w celuex wskazania niektórych „gotchas” na temat zamierzonego przenośnego zastosowania w porównaniu do typowych skryptowych zastosowań exznalezionych online (które są wypełnione vimpoleceniami -specyficznymi).

  1. Wdrożenie +cmdjest opcjonalne zgodnie z POSIX.
  2. Zezwalanie na wiele -copcji jest również opcjonalne.
  3. Komenda globalna :g„zjada” wszystko aż do następnej nowej linii bez znaków ucieczki (i dlatego uruchamia ją po każdym znalezionym dopasowaniu wyrażenia regularnego, a nie raz na końcu). -c 'g/regex/d | x'Usuwa więc tylko jedną instancję, a następnie zamyka plik.

Tak więc, zgodnie z tym, co zbadałem, zgodna z POSIX metoda edycji na miejscu pliku w pełnym systemie plików w celu usunięcia wszystkich wierszy pasujących do określonego wyrażenia regularnego to:

ex -sc 'g/myregex/d
x' /path/to/file/filename

Powinno to działać, pod warunkiem, że masz wystarczającą ilość pamięci, aby załadować plik do bufora.

* Jeśli znajdziesz coś, co wskazuje inaczej, proszę o tym wspomnieć w komentarzach.

Dzika karta
źródło
2
ale ex pisze do plików tmp ... zawsze. jego specyfikacja okresowo zapisywała bufory na dysk. istnieją nawet określone polecenia do lokalizowania buforów plików tmp na dysku.
mikeserv
@Wildcard Dziękuję za udostępnienie. Link do podobnego postu w SO . Zakładam, że ex +g/match/d -scx filejest również zgodny z POSIX?
kenorb
@kenorb, niezupełnie, według mojej lektury specyfikacji - patrz mój punkt 1 w odpowiedzi powyżej. Dokładny cytat z POSIX brzmi: „Narzędzie ex musi być zgodne z wytycznymi XBD Utility Składnia, z wyjątkiem nieokreślonego użycia„ - ”, a „ + ” może być rozpoznane jako separator opcji, a także„ - ”.
Wildcard,
1
Nie mogę tego udowodnić, chyba że odwołuje się do zdrowego rozsądku, ale uważam, że czytasz więcej w tym stwierdzeniu ze specyfikacji, niż jest w rzeczywistości. Sugeruję, że bezpieczniejszą interpretacją jest to, że żadne zmiany w buforze edycji nie wpłyną na żaden plik, który istniał przed rozpoczęciem sesji edycji lub na nazwę użytkownika. Zobacz także moje komentarze do mojej odpowiedzi.
G-Man mówi „Przywróć Monikę”
@ G-Man, myślę, że masz rację; moja początkowa interpretacja była prawdopodobnie pobożnym życzeniem. Ponieważ jednak edytowanie pliku vi działało na pełnym systemie plików, uważam, że w większości przypadków on również działałby ex- choć może nie w przypadku gigantycznego pliku. sed -inie działa na pełnym systemie plików bez względu na rozmiar pliku.
Wildcard
2

Użyj fajki, Luke!

Przeczytaj plik | filtr | odpisać

sed 's/PATTERN//' BIGFILE | dd of=BIGFILE conv=notrunc

w tym przypadku sednie tworzy nowego pliku, a jedynie wysyła potok wyjściowy, do ddktórego otwiera ten sam plik . Oczywiście można użyć grepw szczególnym przypadku

grep -v 'PATTERN' BIGFILE | dd of=BIGFILE conv=notrunc

następnie skróć pozostałe.

dd if=/dev/null of=BIGFILE seek=1 bs=BYTES_OF_SED_OUTPUT
Leben Gleben
źródło
1
Czy zauważyłeś część pytania „pełny system plików” ?
Wildcard
1
@Wildcard, czy sedzawsze używa plików tymczasowych? greptak czy inaczej
Leben Gleben
To wydaje się być alternatywą dla spongedowodzenia. Tak, sedze -izawsze tworzy pliki lilke „seduyUdmw” z 000 praw.
Pablo A
1

Jak zauważono w innych odpowiedziach, sed -idziała poprzez skopiowanie pliku do nowego pliku w tym samym katalogu , dokonanie zmian w procesie, a następnie przeniesienie nowego pliku na oryginał. Dlatego to nie działa.  ed(oryginalny edytor wierszy) działa w nieco podobny sposób, ale ostatnio sprawdzałem, że używa /tmppliku scratch. Jeśli masz /tmpinny system plików niż ten, który jest pełny, edmoże wykonać to za Ciebie.

Spróbuj tego (w interaktywnym monitie powłoki):

$ ed / ścieżka / do / pliku / nazwa pliku
P.
g / myregex / d
w
q

P(Co jest kapitał P) nie jest to bezwzględnie konieczne. Włącza monit; bez tego pracujesz w ciemności, a niektórym ludziom to przeszkadza. wI qw rytu q UIT.

edjest znany z tajemniczej diagnostyki. Jeśli w którymkolwiek momencie wyświetla cokolwiek innego niż monit (który jest *) lub coś, co wyraźnie potwierdza pomyślne działanie ( szczególnie jeśli zawiera a ?), nie zapisuj pliku (z w). Wystarczy wyjść ( q). Jeśli to cię nie wypuści, spróbuj qpowtórzyć.

Jeśli twój /tmpkatalog znajduje się w systemie plików, który jest pełny (lub jeśli jego system plików jest również pełny), spróbuj gdzieś znaleźć miejsce. chaos wspominał o montażu tmpfs lub zewnętrznego urządzenia pamięci masowej (np. dysku flash); ale jeśli masz wiele systemów plików i nie wszystkie są pełne, możesz po prostu użyć jednego z pozostałych. chaos sugeruje skopiowanie pliku (ów) do innego systemu plików, edycję ich tam (za pomocą sed), a następnie skopiowanie ich z powrotem. W tym momencie może to być najprostsze rozwiązanie. Ale alternatywą byłoby utworzenie katalogu do zapisu w systemie plików, który ma trochę wolnego miejsca, ustawienie zmiennej środowiskowej tak, TMPDIRaby wskazywało ten katalog, a następnie uruchomienie ed. (Ujawnienie: Nie jestem pewien, czy to zadziała, ale nie zaszkodzi.)

Gdy zaczniesz eddziałać, możesz to zautomatyzować, wykonując następujące czynności

ed nazwa pliku << EOF
g / myregex / d
w
q
EOF

w skrypcie. Lub , jak sugeruje don_crissti.printf '%s\n' 'g/myregex/d' w q | ed -s filename

G-Man mówi „Przywróć Monikę”
źródło
Hmmm. Czy to samo można zrobić (z edlub z ex), aby pamięć była używana zamiast osobnego systemu plików? Właśnie o to mi chodziło (i dlatego nie przyjąłem odpowiedzi).
Wildcard
Hmm To może być bardziej skomplikowane, niż się spodziewałem. Studiowałem źródło edwiele lat temu. Wciąż istniały takie rzeczy, jak komputery 16-bitowe, na których procesy były ograniczone do przestrzeni adresowej o wielkości 64 KB (!), Więc pomysł edytora odczytującego cały plik do pamięci był niemożliwy do uruchomienia. Od tego czasu pamięć oczywiście się powiększyła - ale także dyski i pliki. Ponieważ dyski są tak duże, ludzie nie odczuwają potrzeby radzenia sobie z ewentualnością /tmpbraku miejsca. Właśnie rzuciłem okiem na kod źródłowy najnowszej wersji edi nadal wydaje się… (ciąg dalszy)
G-Man mówi „Przywróć Monikę”
(Ciągdalszy)… bezwarunkowo zaimplementować „edytuj bufor” jako plik tymczasowy - i nie mogę znaleźć żadnego wskazania, że ​​jakakolwiek wersja ed(lub exlub vi) oferuje opcję zachowania bufora w pamięci.  Z drugiej strony, Edycja tekstu za pomocą ed i vi - Rozdział 11: Przetwarzanie tekstu - Część II: Poznawanie systemu Red Hat Linux - Sekrety Red Hat Linux 9 Professional - Systemy Linux mówią, że edbufor edycji znajduje się w pamięci… (ciąg dalszy )
G-Man mówi „Reinstate Monica”
(Ciąg dalszy)… a przetwarzanie i składanie dokumentów UNIX przez Balasubramaniam Srinivasan mówi o tym samym vi(co jest tym samym programem co ex). Uważam, że używają po prostu niechlujnych, nieprecyzyjnych sformułowań - ale jeśli jest to w Internecie (lub w formie drukowanej), to musi być prawda, prawda? Płacisz pieniądze i podejmujesz decyzję.
G-Man mówi „Przywróć Monikę”
Ale i tak dodałem nową odpowiedź.
G-Man mówi „Przywróć Monikę”
1

Można dość łatwo obciąć plik, jeśli można uzyskać liczbę bajtów do przesunięcia, a linie pojawiają się od punktu początkowego do końca.

o=$(sed -ne'/regex/q;p' <file|wc -c)
dd if=/dev/null of=file bs="$o" seek=1

Albo jeśli masz ${TMPDIR:-/tmp}inny system plików, być może:

{   cut -c2- | sed "$script" >file
} <file <<FILE
$(paste /dev/null -)
FILE

Ponieważ (większość) powłok umieszcza swoje dokumenty tutaj w usuniętym pliku tymczasowym. Jest całkowicie bezpieczny, o ile <<FILEdeskryptor jest utrzymywany od początku do końca i ${TMPDIR:-/tmp}ma tyle miejsca, ile potrzebujesz.

Powłoki, które nie używają plików tymczasowych, używają potoków, więc korzystanie z nich w ten sposób nie jest bezpieczne. Te pociski są zazwyczaj ashpochodne, takie jak busybox, dashBSD sh- zsh, bash, ksh, a Bourne shell, jednak wszystkie pliki tymczasowe stosowanie.

najwyraźniej napisałem mały program powłoki w lipcu zeszłego roku, aby zrobić coś bardzo podobnego do tego


Jeśli /tmpnie jest to wykonalne, to tak długo, jak można zmieścić plik w pamięci coś w rodzaju ...

sed 'H;$!d;x' <file | { read v &&
sed "$script" >file;}

... jako ogólny przypadek zapewniłby przynajmniej pełne buforowanie pliku przez pierwszy sedproces przed próbą obcięcia pliku wejścia / wyjścia.

Bardziej ukierunkowanym - i wydajnym - rozwiązaniem może być:

sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}

... bo to i tak nie przeszkadza w buforowaniu linii, które chciałeś usunąć.

Test przypadku ogólnego:

{   nums=/tmp/nums
    seq 1000000 >$nums
    ls -lh "$nums"
    wc -l  "$nums"
    sed 'H;$!d;x' <$nums | { read script &&  ### read always gets a blank
    sed "$script" >$nums;}
    wc -l  "$nums"
    ls -lh "$nums"
}

-rw-r--r-- 1 mikeserv mikeserv 6.6M Dec 22 20:26 /tmp/nums
1000000 /tmp/nums
1000000 /tmp/nums
-rw-r--r-- 1 mikeserv mikeserv 6.6M Dec 22 20:26 /tmp/nums
mikeserv
źródło
Przyznaję, że wcześniej nie przeczytałem szczegółowo twojej odpowiedzi, ponieważ zaczyna się ona od niemożliwych (dla mnie) rozwiązań, które wymagają liczenia bajtów (różnych na każdym z wielu serwerów) i /tmpktóre znajdują się w tym samym systemie plików. Podoba mi się twoja podwójna sedwersja. Myślę, że kombinacja Barmara i twojej odpowiedzi byłaby prawdopodobnie najlepsza, coś w stylu: myvar="$(sed '/myregex/d' < file)" && [ -n "$myvar" ] && echo "$myvar" > file ; unset myvar (W tym przypadku nie dbam o zachowanie końcowych linii).
Wildcard
2
@Wildcard - to może być. ale nie powinieneś używać powłoki jak bazy danych. sed| catpowyższa rzecz nigdy nie otwiera danych wyjściowych, chyba sedże buforował już cały plik i jest gotowy do zapisania wszystkich danych wyjściowych. Jeśli spróbuje buforować plik i nie powiedzie się - readnie powiedzie się, ponieważ odnajdzie EOF na |potoku przed odczytaniem pierwszej nowej linii, a więc cat >out nigdy nie zdarzy się, dopóki nie wypisze go całkowicie z pamięci. przelew lub coś podobnego po prostu zawiedzie. również cały rurociąg zwraca sukces lub porażkę za każdym razem. przechowywanie go w var jest po prostu bardziej ryzykowne.
mikeserv
@Wildcard - gdybym naprawdę chciał tego również w zmiennej, myślę, że robię to tak: file=$(sed '/regex/!H;$!d;x' <file | read v && tee file) && cmp - file <<<"$file" || shitewięc plik wyjściowy i var byłyby zapisywane jednocześnie, co tworzyłoby jedną lub jedną skuteczną kopię zapasową, co jest jedynym powodem, dla którego chcesz komplikuj rzeczy bardziej niż potrzebujesz.
mikeserv
@mikeserv: Mam teraz ten sam problem co OP i uważam, że twoje rozwiązanie jest bardzo przydatne. Ale nie rozumiem użycia read scripti read vtwojej odpowiedzi. Jeśli będziecie mogli rozwinąć więcej na ten temat, będę bardzo wdzięczny, dzięki!
sylye
1
@sylye - $scriptto sedskrypt, którego użyłbyś do kierowania na dowolną część pliku, którą chciałeś; jest to skrypt, który zapewnia wynik końcowy, który chcesz w strumieniu. vjest tylko symbolem zastępczym pustej linii. w bashpowłoce nie jest to konieczne, ponieważ zamiast niej bashautomatycznie użyje $REPLYzmiennej powłoki, ale POSIXly zawsze powinieneś to robić. Nawiasem mówiąc, cieszę się, że okaże się przydatny. powodzenia z tym. im mikeserv @ gmail, jeśli potrzebujesz czegoś dogłębnie. powinienem mieć komputer za kilka dni
mikeserv
0

Ta odpowiedź zapożycza pomysły z tej drugiej odpowiedzi i tej innej odpowiedzi, ale opiera się na nich, tworząc odpowiedź, która ma bardziej ogólne zastosowanie:

num_bytes = $ (sed '/ myregex / d' / path / to / file / filename | wc -c)
sed '/ myregex / d' / path / to / file / filename 1 <> / path / to / file / filename 
dd if = / dev / null of = / path / to / file / filename bs = "$ num_bytes" seek = 1

W pierwszym wierszu uruchamiana jest sedkomenda z wyjściem zapisanym na standardowe wyjście (a nie do pliku); konkretnie do potoku, wcaby policzyć znaki. W drugim wierszu uruchamiana jest również sedkomenda z wyjściem zapisanym na standardowe wyjście, które w tym przypadku jest przekierowywane do pliku wejściowego w trybie nadpisywania odczytu / zapisu (bez obcinania), o którym tutaj mowa . Jest to dość niebezpieczna rzecz; jest bezpieczny tylko wtedy, gdy polecenie filtrowania nigdy nie zwiększa ilości danych (tekstu); tzn. dla każdego n odczytanych bajtów zapisuje n lub mniej bajtów. Dotyczy to oczywiście sed '/myregex/d'polecenia; dla każdej linii, którą czyta, zapisuje dokładnie tę samą linię lub nic. (Inne przykłady:s/foo/fu/lub s/foo/bar/będzie bezpieczna, ale s/fu/foo/i s/foo/foobar/nie będzie).

Na przykład:

$ cat filename
It was
a dark and stormy night.
$ sed '/was/d' filename 1<> filename
$ cat filename
a dark and stormy night.
night.

ponieważ te 32 bajty danych:

I  t     w  a  s \n  a     d  a  r  k     a  n  d     s  t  o  r  m  y     n  i  g  h  t  . \n

został zastąpiony tymi 25 znakami:

a     d  a  r  k     a  n  d     s  t  o  r  m  y     n  i  g  h  t  . \n

pozostawiając siedem bajtów night.\npozostałych na końcu.

Na koniec ddpolecenie szuka końca nowych, oczyszczonych danych (bajt 25 w tym przykładzie) i usuwa resztę pliku; tzn. w tym momencie obcina plik.


Jeśli z jakiegoś powodu 1<>sztuczka nie działa, możesz to zrobić

sed '/ myregex / d' / path / to / file / filename | dd = = / ścieżka / do / pliku / nazwy pliku conv = notrunc

Pamiętaj też, że dopóki wszystko, co robisz, to usuwanie linii, wszystko czego potrzebujesz to grep -v myregex(jak zauważył Barmar ).

G-Man mówi „Przywróć Monikę”
źródło
-3

sed -i 'd' / path / to / file / filename

Chiranjeeb
źródło
1
Cześć! Najlepiej byłoby wyjaśnić tak szczegółowo, jak to istotne, jak działa twoje rozwiązanie i odpowiedzieć na pytanie.
dhag
2
To okropna brak odpowiedzi. (a) Nie powiedzie się na pełnym systemie plików, tak jak moje oryginalne polecenie; (b) Jeśli się powiedzie, opróżni cały plik, zamiast tylko wierszy pasujących do mojego wyrażenia regularnego.
Wildcard