Edycje w systemie sed na OS X

Chciałbym edytować plik z sed na OS X. używam następującego polecenia:

sed 's/oldword/newword/' file.txt

Wyjście jest wysyłane do terminala. plik.txt nie jest modyfikowany. Zmiany są zapisywane w pliku2.txt {[7] } z tą komendą:

sed 's/oldword/newword/' file1.txt > file2.txt

Jednak nie chcę kolejnego pliku. Chcę tylko edytować plik1.txt . Jak mogę to zrobić?

Próbowałem flagi. Powoduje to następujący błąd:
sed: 1: "file1.txt": invalid command code f
Author: kenorb, 2011-09-27

7 answers

Można poprawnie użyć znacznika -i, podając mu przyrostek do dodania do pliku kopii zapasowej. Rozszerzenie przykładu:

sed -i.bu 's/oldword/newword/' file1.txt

Da ci dwa pliki: jeden o nazwie file1.txt, która zawiera substytucję, i jeden o nazwie file1.txt.bu, która ma oryginalną zawartość.

Lekko niebezpieczne

Jeśli chcesz nadpisać oryginalny plik, użyj czegoś w stylu:

sed -i '' 's/oldword/newword/' file1.txt
      ^ note the space

Ze względu na sposób parsowania linii wymagana jest spacja pomiędzy znacznikiem opcji a jej argumentem , ponieważ argument ma długość zerową.

Poza zniszczeniem twojego oryginału, Nie jestem świadomy dalszych niebezpieczeństw oszukania sed w ten sposób. Należy jednak zauważyć, że jeśli wywołanie sed jest częścią skryptu, uniksową metodą (IMHO) byłoby użycie sed w sposób nieniszczący, sprawdzenie, czy wywołanie zakończyło się czysto, a dopiero potem usunięcie obcego pliku.
 317
Author: whittle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-31 11:51:26

Mam podobny problem z MacOS

sed -i '' 's/oldword/newword/' file1.txt

Nie działa, ale

sed -i"any_symbol" 's/oldword/newword/' file1.txt
Działa dobrze.
 24
Author: ksnt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-19 06:00:02
sed -i -- "s/https/http/g" file.txt
 7
Author: jazzed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-09 05:11:20

Możesz użyć -i'' (--in-place) dla sed Jak już sugerowano. Zobacz: argument -i in-place, jednak zauważ, że opcja -i jest niestandardowym rozszerzeniem FreeBSD i może nie być dostępna w innych systemach operacyjnych. Po drugie sed jest Stream ED itor, a nie edytor plików.


Alternatywnym sposobem jest użycie wbudowanego substytucji w trybie Vim Ex, jak:

$ ex +%s/foo/bar/g -scwq file.txt

I dla wielu plików:

$ ex +'bufdo!%s/foo/bar/g' -scxa *.*

aby edytować wszystkie pliki rekurencyjnie moĹźna uĺźywaä ‡ **/*.*, jeĹ "li powĺ' oka to wspiera (enable by shopt -s globstar).


Innym sposobem jest użycie gawk i jego nowe rozszerzenie "inplace" takie jak:

$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1
 5
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-18 22:22:51

Tworzy pliki kopii zapasowych. Np. sed -i -e 's/hello/hello world/' testfile dla mnie tworzy plik kopii zapasowej, testfile-e, w tym samym katalogu.

 4
Author: JustADude,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-10 20:18:34

Flaga -i prawdopodobnie nie działa dla Ciebie, ponieważ podałeś przykład dla GNU sed podczas gdy macOS używa BSD sed i mają one nieco inną składnię.

Wszystkie inne odpowiedzi mówią jak poprawić składnię do pracy z BSD sed. Alternatywą jest zainstalowanie GNU sed na macOS za pomocą:

brew install gsed

A następnie użyj go zamiast wersji sed dostarczonej z systemem macOS (zwróć uwagę na prefiks g), np:

gsed -i 's/oldword/newword/' file1.txt

Jeśli chcesz GNU sed polecenia, aby być zawsze przenośnym na macOS, możesz dodać katalog "gnubin" do ścieżki, dodając coś takiego do twojego .bashrc/.zshrc file (run brew info gsed to see what exactly you need to do):

export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"

I od tej pory GNU sed staje się Twoim domyślnym sed i możesz po prostu uruchomić:

sed -i 's/oldword/newword/' file1.txt
 1
Author: Jakub Kukul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-03 02:28:04

Możesz użyć:

sed -i -e 's/<string-to-find>/<string-to-replace>/' <your-file-path>

Przykład:

sed -i -e 's/Hello/Bye/' file.txt
To działa bez zarzutu w Mac .
 0
Author: Vincent Lal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-21 15:15:20