Jak programowo edytować plik przy użyciu tylko terminala?


13

Chciałbym napisać skrypt powłoki, w którym mógłbym odczytać plik z polecenia i edytować plik bez ręcznej interwencji (w oparciu o wyszukiwanie tekstu i zastąpienie go innym).

Nie potrzebuję do tego żadnego edytora tekstu .... po prostu wyszukuję tekst (np. Używając grep), a następnie zastępuję go innym tekstem i zapisuję zmiany ...

Odpowiedzi:


10

Tam właśnie sedpojawia się gra. sedKomenda ma następujący format:

[pattern1][,pattern2][!] command [args]

Używa wyrażeń regularnych, więc może być / będzie trochę trudny. Kilka podstawowych przykładów zaczerpniętych z drugiego linku poniżej:

# zamień (znajdź i zamień) „foo” na „bar” w każdej linii
sed 's / foo / bar /' # zastępuje tylko 1. instancję w linii
sed 's / foo / bar / 4' # zastępuje tylko 4. instancję w linii
sed 's / foo / bar / g' # zastępuje WSZYSTKIE wystąpienia w linii
sed 's / \ (. * \) foo \ (. * foo \) / \ 1bar \ 2 /' # zamień przypadek z ostatniego na ostatni
sed 's / \ (. * \) foo / \ 1bar /' # zamień tylko ostatnią literę

# zamień „foo” na „bar” TYLKO dla linii zawierających „baz”
sed '/ baz / s / foo / bar / g ”

# zamień „foo” na „bar” Z WYJĄTKIEM wierszy zawierających „baz”
sed '/ baz /! s / foo / bar / g'

# zmień „szkarłat” lub „rubin” lub „puce” na „czerwony”
sed 's / scarlet / red / g; s / ruby ​​/ red / g; s / puce / red / g' # most seds
gsed 's / scarlet \ | ruby ​​\ | puce / red / g' # GNU sed only

Niektóre referencje


7

Bardzo późna odpowiedź. Może to jednak pomóc innym z podobnym problemem / pytaniem.

Poleciłbym stworzyć i zastosować łatkę. Dobry przykład można znaleźć tutaj .

Na przykład, zakładając, że plik new.txt zawiera zmiany, które chcesz zastosować do old.txt. Możesz wykonywać polecenia na terminalu lub tworząc i wykonując plik patch_file.sh.

Wiersz poleceń: otwórz terminal i skopiuj i wykonaj poniższe wiersze (w razie potrzeby zmień nazwy plików):

diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

Skrypt: przy użyciu podejścia do pliku .sh. W terminalu (klawiatura: ctrl + alt + t: gedit patch_file.sh

Skopiuj i wklej polecenia, które byłyby uruchamiane na terminalu, do pliku .sh i pod nagłówkiem, jak pokazano poniżej (gedit).

#!/bin/sh
diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

Ustaw skrypt jako wykonywalny (terminal):

chmod +x patch_file.sh

Uruchom skrypt (terminal):

./patch_file.sh # may require sudo access depending on the directory affected

Łatka +1 jest zawsze prostą drogą do średnich lub ciężkich lub złożonych modyfikacji. Nie wiem, dlaczego niektórzy próbują robić wszystko za pomocą narzędzi regularnych.
— user.dz

Daje +1 o wiele lepiej niż inżynieria wsteczna wyrażenia regularnego, które wydaje się stosować pożądaną zmianę w testowanym pliku ... ale gdy zastosuje się go do innych wystąpień tego pliku, czasami ma inne efekty.
— bigjosh

Czy łatka ma sens, jeśli chcę zastąpić wszystkie wystąpienia określonych ciągów tekstowych, tj. Zamień wszystkie „” na „_”, wszystkie „minus” na „-” i wszystkie „gb | <ciąg_numerów> | ARO:„ na ” ARO: „? Dzięki.
— Josh

1

Jeśli chcesz edytować plik, użyj edytora plików, istnieją edytory plików oparte na poleceniach, których można używać ze skryptów, np. Ex lub ed .


1

Szukasz sed lub awk. Uważam, że sed jest prostszy, a awk - mocniejszy.

Oto przykład z innego pytania .

sed -i 's/gedit.desktop/yournew.desktop/g' /usr/share/applications/defaults.list

To znaczy:

  • szukaj w pliku /usr/share/applications/defaults.list
  • Znajdź / grep gedit.desktop
  • Zamienić yournew.desktop
  • Zastosuj zmiany w miejscu -i

0

W zależności od tego, co trzeba zmienić, jeśli jesteś zaznajomiony z viczym edmogą być użyteczne.

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.