Jaki jest najprostszy sposób znalezienia i zastąpienia danego ciągu wejściowego, powiedzmy abc
, i zastąpienia innym ciągiem, powiedzmy XYZ
w pliku /tmp/file.txt
?
Piszę aplikację i używam IronPython do wykonywania poleceń przez SSH - ale nie znam tak dobrze Uniksa i nie wiem, czego szukać.
Słyszałem, że Bash, oprócz tego, że jest interfejsem wiersza poleceń, może być bardzo potężnym językiem skryptowym. Więc jeśli to prawda, zakładam, że możesz wykonywać takie działania.
Czy mogę to zrobić za pomocą bash i jaki jest najprostszy (jednowierszowy) skrypt do osiągnięcia mojego celu?
sed
:s/..../..../ - Substitute
i/g - Global
invalid command code C
błąd ... W przypadku zamiany w miejscu BSDsed
wymaga rozszerzenia pliku po oznaczeniu,-i
ponieważ zapisuje plik kopii zapasowej z danym rozszerzeniem. Na przykład:sed -i '.bak' 's/find/replace/' /file.txt
Możesz pominąć tworzenie kopii zapasowej, używając pustego ciągu w następujący sposób:sed -i '' 's/find/replace/' /file.txt
s/abc/XYZ/gi
Manipulowanie plikami zwykle nie jest wykonywane przez Bash, ale przez programy wywoływane przez Bash, np .:
-i
Flaga informuje go zrobić wymianę w miejscu.Zobacz
man perlrun
więcej szczegółów, w tym jak wykonać kopię zapasową oryginalnego pliku.źródło
perl -pi -e 's/chdir (?:\\/[\\w\\.\\-]+)+/chdir blah/g' text
, ale wciąż pojawia się błąd z Brakiem spacji między wzorcem a następnym słowem jest przestarzały w wierszu 1-szym. Niezrównany (w wyrażeniu regularnym; oznaczony <- TUTAJ w m / (chdir) () (<- TUTAJ ?: \\ / at -e wiersz 1.Byłem zaskoczony, kiedy potknąłem się o to ...
Istnieje pakiet,
replace
który jest dostarczany z"mysql-server"
pakietem, więc jeśli go zainstalowałeś, wypróbuj:Zobacz
man replace
więcej na ten temat.źródło
replace
jest użytecznym niezależnym narzędziem, a ludzie MySQL powinni go wydać osobno i od niego polegać b)replace
wymaga trochę MySQL o_O Tak czy inaczej, instalowanie serwera mysql w celu zastąpienia byłoby niewłaściwe :)mysql-server
zainstalowanego pakietu. Jak wskazuje @rayro,replace
jest częścią tego.To jest stary post, ale dla każdego, kto chce używać zmiennych, ponieważ @centurian powiedział, że pojedyncze cudzysłowy oznaczają, że nic nie zostanie rozwinięte.
Prostym sposobem na uzyskanie zmiennych jest połączenie łańcuchów, ponieważ odbywa się to przez zestawienie w bash, co powinno działać:
źródło
Bash, podobnie jak inne powłoki, jest tylko narzędziem do koordynowania innych poleceń. Zazwyczaj próbowałbyś użyć standardowych poleceń UNIX, ale możesz oczywiście użyć Bash do wywołania czegokolwiek, w tym własnych skompilowanych programów, innych skryptów powłoki, skryptów Python i Perl itp.
W takim przypadku można to zrobić na kilka sposobów.
Jeśli chcesz odczytać plik i zapisać go w innym pliku, wykonując wyszukiwanie / zamianę w trakcie pracy, użyj sed:
Jeśli chcesz edytować plik na miejscu (tak jakbyś otwierał plik w edytorze, edytuje go, a następnie zapisuje), dostarcz instrukcje do edytora liniowego „ex”
Ex jest jak vi bez trybu pełnoekranowego. Możesz nadać mu takie same polecenia, jak w wierszu polecenia vi: '.
źródło
Znalazłem ten wątek między innymi i zgadzam się, że zawiera on najbardziej kompletne odpowiedzi, więc dodaję też mój:
sed
ied
są bardzo przydatne ... ręcznie. Spójrz na ten kod z @Johnny:Gdy moim ograniczeniem jest używanie go w skrypcie powłoki, nie można używać żadnej zmiennej zamiast „abc” lub „XYZ”. BashFAQ wydaje się zgodzić z tym, co rozumiem, co najmniej. Nie mogę więc użyć:
ale co możemy zrobić? Jak powiedział @Johnny, użyj,
while read...
ale niestety to nie koniec historii. Poniższe działało ze mną dobrze:Jak widać, jeśli
nullglob
jest ustawiony, zachowuje się dziwnie, gdy istnieje ciąg zawierający a*
:który staje się
nie ma wspornika kąta końcowego, a Apache2 nie może nawet załadować.
Ten rodzaj analizy powinien być wolniejszy niż wyszukiwanie za jednym naciśnięciem przycisku i zastępować, ale, jak już zauważyłeś, istnieją cztery zmienne dla czterech różnych wzorców wyszukiwania działających w jednym cyklu analizy.
Najbardziej odpowiednie rozwiązanie, jakie mogę wymyślić, biorąc pod uwagę założenia problemu.
źródło
sed -e "s/$x/$y/"
i zadziała. Nie podwójne cytaty. Może stać się bardzo mylące, jeśli ciągi w samych zmiennych zawierają znaki o specjalnym znaczeniu. Na przykład jeśli x = „/” lub x = „\”. Kiedy trafisz na te problemy, prawdopodobnie oznacza to, że powinieneś przestać próbować używać powłoki do tego zadania.Możesz użyć
sed
:Posługiwać się
-i
dla „ignorować sprawy”, jeśli nie jesteś pewny, aby znaleźć tekst jestabc
alboABC
alboAbC
, itpMożesz użyć
find
ased
jeśli nie znasz swojej nazwy pliku:Znajdź i zamień we wszystkich plikach Python:
źródło
Możesz także użyć
ed
polecenia, aby przeprowadzić wyszukiwanie w pliku i zastąpić:Zobacz więcej w „ Edycja plików za pomocą skryptów za pomocą
ed
”.źródło
sed -i <pattern> <filename>
). Bardzo dobrze!Jeśli plik, nad którym pracujesz, nie jest tak duży, a tymczasowe przechowywanie go w zmiennej nie stanowi problemu, możesz użyć podstawienia ciągu Bash jednocześnie w całym pliku - nie ma potrzeby przechodzenia nad nim wiersz po wierszu:
Cała zawartość pliku będzie traktowana jako jeden długi ciąg, łącznie z podziałami wiersza.
XYZ może być zmienną, np.
$replacement
Jedną z zalet nieużywania sed jest to, że nie trzeba się martwić, że ciąg wyszukiwania lub zamiany może zawierać znak ogranicznika wzorca sed (zwykle, ale niekoniecznie, /). Wadą jest brak możliwości używania wyrażeń regularnych lub bardziej wyrafinowanych operacji sed.źródło
Zachowaj ostrożność, zastępując adresy URL znakiem „/”.
Przykład jak to zrobić:
Wyodrębniono z: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html
źródło
Spróbuj wykonać następujące polecenie powłoki:
źródło
sed
, użyjsed -i''
zamiast tego.Aby edytować tekst w pliku bez interakcji, potrzebujesz lokalnego edytora tekstu, takiego jak vim.
Oto prosty przykład, jak go używać z wiersza poleceń:
Jest to odpowiednik @slim odpowiedź z ex redaktor, który jest w zasadzie to samo.
Oto kilka
ex
praktycznych przykładów.Zastępowanie tekstu
foo
zebar
w pliku:Usuwanie końcowych spacji dla wielu plików:
Rozwiązywanie problemów (gdy terminal jest zablokowany):
-V1
parametr, aby wyświetlić pełne wiadomości.-cwq!
.Zobacz też:
źródło
-V1
, aby wymusić zamknięcie, użyjwq!
.Możesz używać Pythona również w skrypcie bash. Nie udało mi się odnieść sukcesu z niektórymi najważniejszymi odpowiedziami tutaj i znalazłem, że zadziałało to bez potrzeby stosowania pętli:
źródło
Możesz użyć polecenia rpl. Na przykład chcesz zmienić nazwę domeny w całym projekcie php.
Nie jest to oczywiste uderzenie przyczyny, ale jest bardzo szybkie i przydatne. :)
źródło