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 ...

Rohit Bansal
źródło

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

Rinzwind
źródło
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
użytkownik3832905
źródło
Ł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 .

geirha
źródło
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
RobotHumans
źródło
0

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

Glenn Jackman
źródło