W mojej konkretnej sytuacji potrzebuję przechodzić przez kilkaset plików zawierających zmienną przechowującą adres URL. Wszystkie adresy są różne, ale przez wzgląd na tym przykładzie możemy założyć, że wszystko skończy z „COM"”Jak użyć sed do zamiany wzorca w pliku tylko w liniach, które zawierają inny wzór
muszę dodać jakiś tekst bezpośrednio po com
Ponieważ wszystkie adresy URL będą musiały różne domeny nie może użyć polecenia sed jak:
sed -i 's/^ENVIRONMENT="someurl.com"/ENVIRONMENT="someurl.com.origin.net"/g'
Ponieważ pliki zawierać inne linie, które mogą zawierać com, nie mogę używać coś takiego:
sed -i 's/com/com.origin.net/g'
muszę zrobić to szukanie i wymienić tylko na konkretnej linii zawierającej wzorzec, takie jak z moim przykładzie poniżej w regex:
^ENVIRONMENT.*
Gdybym mógł skupić sedację tylko na linii, która pasował do powyższego wzoru, mógłbym użyć adaptacji sed, takich jak sed -i 's/com/com.origin.net/g'
. Mógłbym oczywiście napisać zbyt skomplikowany skrypt basha, ale wiem, że jest ładny jeden sposób liniowy, aby przekonać sed, aby znalazł wzór, działa tylko na linii, w której znajduje się wzorzec, i szuka i zamienia inny wzór z nowym ciągiem.
W poszukiwaniu Google, tylko pół odpowiedni link znalazłem na ten temat było:
https://unix.stackexchange.com/questions/37518/how-to-sed-only-that-lines-that-contains-given-string
ale nie wystarczająco odpowiedzieć na moje pytanie. Również być w stanie ograniczyć sed w ogóle do linii, która pasuje do wzorca byłoby przez ładne narzędzie, aby dodać do mnie arsenał sed.
Każda pomoc, która doprowadzi do rozwiązania tutaj, będzie bardzo cenna.
Oto przykład pliku
### Example File
#
#
# someurl.com
ENVIRONMENT="someurl.com"
Chcę zastąpić „środowisko =" someurl .pl "” o «środowisko =«someurl.com.orign.net»»
to pewnie umieścić sed polecenie pochodzące z tego stanowiska do skryptu, powłoki tak, takie jak:
`dla F w * .config; do File2BeEdited = $ (cat $ f | grep^PatternToIdentifyLine | grep -v RemoveLinesThatAreAlreadyCorrect); jeśli ["$ File2BeEdited"! = ""]; następnie RunSedCommand; printf "\ nZnajdź plik, który chcesz edytować.\ NRunning sed na $ F >> log.log "; zrobić
Więc mogłem pętli każdego pliku konfiguracyjnego w katalogu i selektywnie wprowadzić tę zmianę
Dzięki to jest dokładnie to, co chciałem osiągnąć. Szczególnie możliwość wstawienia dopasowanego tekstu. Tylko po to, aby wyjaśnić moją wiedzę na temat dopasowanego aspektu zastępowania tekstu udzieloną przez Ciebie; co mogłem osiągnąć przy pomocy \ 0? Ponadto, jeśli użyję \ 2 na przykład, to to wstawi powiedzieć drugi dopasowany tekst z regex. Na przykład, jeśli szukałem linii z 2 wzorami do dopasowania. – Matthew
Zapoznaj się z podręcznikiem GNU sed: [backreferences in regular expressions] (http://www.gnu.org/software/sed/manual/sed.html#index-Backreferences_002c-in-regular-expressions-103) – nosid
Używasz tego, co "sed" nazywa adresy? – Geremia