Jak wyczyścić tekst w pliku?

70

Jak usunąć tekst, który istniał w pliku tekstowym bez jego otwierania?

Mam na przykład na myśli, że mam plik hello.txtz pewnymi danymi tekstowymi i jak mogę wyczyścić cały tekst w tym pliku bez jego otwierania?

Rozumiem przez to, że nie używam żadnego edytora, takiego jak nano, Gedit itp.

rɑːdʒɑ
źródło
1
Co rozumiesz przez „otwieranie” pliku? We wszystkich dotychczasowych odpowiedziach plik będzie nadal otwarty do zapisu przez powłokę. W końcu powłoka jest po prostu programem jak każdy inny.
Jeff
@Jeff nie używa niczego takiego jak nano, gedit itp.
rɑːdʒɑ
Hus787 Nie pisałem, że się tam dostaję, jeśli tak myślisz, więc z zadowoleniem przyjmuję twoje zainteresowanie moim pytaniem.
rɑːdʒɑ
Zgadzam się z komentarzem Jeffa ... Ja też mam opinię *, że strumień pliku musi zostać otwarty, aby do niego napisać, bez względu na to, czy korzystasz z edytora tekstu, czy przekierowania. ( * doceniam, że ktoś podsuwa linki, aby pomóc w tej sprawie )
dokładnie

Odpowiedzi:

138

Wystarczy otworzyć terminal za pomocą CTRL+ ALT+ Ti wpisać as

 > hello.txt

to wszystko, twoje dane w tym pliku zostaną wyczyszczone nawet bez ich otwierania.

Przykład:

wprowadź opis zdjęcia tutaj

rɑːdʒɑ
źródło
5
Technicznie plik zostanie otwarty. Po prostu nie w edytorze.
John Dibling,
2
@JohnDibling w rzeczywistości jest to przekierowanie, uważam, że plik nie jest tutaj otwierany. W przekierowaniu Treść stdoutzastępuje istniejący plik, jeśli taki istnieje. W tym przypadku nie ma nic stdout. Tak więc plik jest zastępowany nieważnością, co w zasadzie powoduje usunięcie ewentualnych danych.
souravc
Czy istnieje sposób na cofnięcie tego polecenia?
Rao,
@Rao, jeśli jest duży jak> 10 GB, może być. Ale w jakim stopniu nie jestem pewien.
rɑːdʒɑ
28

Najprostszym sposobem na obcięcie pliku jest przekierowanie wyjścia powłoki no-op command ( :) do pliku, który chcesz usunąć.

: > hello.txt
eradman
źródło
2
Prawdopodobnie nie jest to najłatwiejsze (w stosunku do sprawiedliwego >), ale na pewno najszybsze. Zastanawiam się, dlaczego nie wspomniano o nim w żadnej z odpowiedzi na to pytanie, które się tu
pojawiło.
13

Użyję również przekierowania jak odpowiedzi rajagenupula. Ale jest trochę więcej elastyczności. Otwórz terminal i wpisz,

cat > hello.txt

I naciśnij Ctrl+ C. Wymaże poprzedni plik. Jeśli chcesz aż tak bardzo, jest w porządku.

Jeśli chcesz, możesz wyczyścić plik po wyczyszczeniu. W ten sposób nie tylko możesz wyczyścić plik bez otwierania, ale także możesz napisać kilka wierszy z odpowiednim formatowaniem w pliku. Załóżmy, że po wyczyszczeniu pliku chcesz napisać „Ubuntu to najlepszy system operacyjny”

cat > hello.txt
Ubuntu is the 
best OS

Następnie naciśnij Ctrl+ C. Teraz poprzedni plik został usunięty. W tym samym czasie słowa są w dwóch wierszach, gdy je umieszczam.

Zobacz przykład:

wprowadź opis zdjęcia tutaj

souravc
źródło
hej dziękuję za odpowiedź. tak mało, ale praca do zrobienia zaraz potem, ale wciąż ciekawa. + 1
rɑːdʒɑ
>oznacza przekierowanie. cat > filezapisze stdoutdo pliku, zastępując istniejący plik.
souravc
10

Cały czas muszę to robić z plikami dziennika. Najłatwiejszy sposób, jaki znalazłem, to użycie następującego polecenia:

cat /dev/null > hello.txt

Spowoduje to usunięcie zawartości pliku i pozostanie pustym plikiem bez konieczności otwierania go w edytorze, zaznaczania tekstu i innych tego typu rzeczy. Dokładniej mówiąc, zastępuje zawartość pliku zawartością „/ dev / null” lub niczym. Właściwie jest to całkiem sprytne.

Jedynym zastrzeżeniem jest to, że użytkownik, którego jesteś aktualnie zalogowany, musi mieć uprawnienia do zapisu do wspomnianego pliku.

Don Briggs
źródło
Dziękuję za Twoją odpowiedź. Dodaj przykład, aby wyglądał ładniej. + 1
rɑːdʒɑ
5

Jeśli plik został utworzony o nazwie hello.txt i zawierał niektóre teksty, poniższe polecenie w terminalu ctrl+ alt+ tusunie cały tekst w pliku hello.txt ,

echo "" > hello.txt

wprowadź opis zdjęcia tutaj

Avinash Raj
źródło
Dziękujemy za odpowiedź, +1. rozszerz go o jakiś przykład, aby mógł wyglądać ładniej.
rɑːdʒɑ
3

Innym podejściem - do plikucp/dev/null

xieerqi:$ cat testFile.txt                                                                                        
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda1      115247656 83100492  26269816  76% /
none                   4        0         4   0% /sys/fs/cgroup
udev             2914492        4   2914488   1% /dev
tmpfs             585216     1152    584064   1% /run
none                5120        0      5120   0% /run/lock
none             2926072    98096   2827976   4% /run/shm
none              102400       76    102324   1% /run/user

xieerqi:$ cp /dev/null testFile.txt                                                                               

xieerqi:$ cat testFile.txt

xieerqi:$ 
Sergiy Kolodyazhnyy
źródło
jesteś niesamowitym człowiekiem!
Yasser Sinjab,
2

Nie najkrótsza odpowiedź, ale ...

Ta odpowiedź jest oparta na innej od Super User . Chociaż nie jest to najkrótsze polecenie bash, truncatejest najbardziej czytelne dla przeciętnych początkujących:

$ echo Hello > Hello.txt
$ echo World! >> Hello.txt
$ cat Hello.txt
Hello
World!
$ truncate -s 0 Hello.txt
$ ll Hello.txt
-rw-rw-r-- 1 rick rick 0 Mar 20 17:32 Hello.txt

Parametry używane truncatetutaj z poleceniem:

  • „-s” ustawia rozmiar
  • Rozmiar „0” będzie wynosił zero

Wyczyść wszystko oprócz pierwszych 10 000 bajtów

Zaletą truncatejest to, że możesz określić, ile chcesz zachować, a nie tylko zero:

$ truncate -s 10000 Hello.txt

... obetnie wszystko po pierwszych 10 000 bajtów. Może to być przydatne, jeśli jakiś program oszalał i zrzucił wiele megabajtów danych do małego pliku dziennika:

  • Uruchom truncatepolecenie, aby uzyskać rozsądnie większy normalny rozmiar 10 KB
  • Otwórz plik za pomocą edytora tekstu i naciśnij End
  • Podświetl i, PgUpaby usunąć pozostałe bajty, które nie należą (zwykle rozpoznawalne przez śmieciowe znaki ASCII).
WinEunuuchs2Unix
źródło
0

Widzę więc, że do odpowiedzi na to pytanie zastosowano wiele przekierowań;)

Trochę inne podejście do kombinacji: rm i dotyk

rm hello.txt && touch hello.txt

( tak ... jeszcze jeden kod! )

Tak więc dzięki temu zestawowi poleceń plik hello.txt nie został otwarty, a na końcu nadal masz plik hello.txt z wyczyszczoną zawartością. Tak jak chciałeś!

precyzyjny
źródło
3
Moim zdaniem nie jest to dobre „oszustwo”, może zmienić uprawnienia do plików ...
Parto
1
Może to być lepiej usunięte. Może to prowadzić do problemów: uprawnienia mogą się zmieniać. Jeśli zostanie to wykonane w pliku dziennika, może to prowadzić do nieoczekiwanego działania usługi, która oczekuje, że dziennik będzie tam dostępny i będzie zapisywalny.
Rinzwind
Chociaż ta odpowiedź nie jest najlepszym sposobem na zainteresowanie: Aby rozwiązać problemy z właścicielem / pozwoleniem, najpierw sprawdź własność i uprawnienia, a następnie dołącz to (dostosuj zgodnie z wymaganiami): && sudo chown użytkownik: grupa hello.txt && sudo chmod 644 hello.txt
Chris
numer i-węzła zostanie usunięty. zostanie utworzony nowy numer i-węzła. zły pomysł.
Dipankar Nalui
0
vi filename -c ':1,$d' -c ':wq'

działał dla mnie najlepiej ze względu na konkretne pozwolenie, jakie miał

Daniel
źródło
Możesz poprawić tę odpowiedź, opracowując problem, który miałeś. Możesz także wyjaśnić, czym vijest program i co robią różne parametry i argumenty.
WinEunuuchs2Unix