2013-04-15 12 views
5

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ę

Odpowiedz

9

Poniższe polecenie pokazuje dwa możliwe rozwiązania: Ty może ograniczyć wymianę do niektórych liniach /regex/. I można użyć dopasowanego tekstu zamienników z \0, \1 itp

sed -e '/^\(ENVIRONMENT="[^"]*\.com\)"/s//\1.origin.net"/' 
+0

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

+1

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

+0

Używasz tego, co "sed" nazywa adresy? – Geremia

-2

można to zrobić z gvim ..

: g/^ baz/s/foo/bar/g

wyjaśnienie: we wszystkich linijkach zaczynających się od baz, zamień wszystkie wystąpienia foo na pasek.

check http://vim.wikia.com/wiki/Search_and_replace więcej szczegółów ..

+2

OP poprosił o rozwiązanie w "sed"; to nie jest sed. –