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