Mam plik ze słowem kluczowym RESOURCE. Może wystąpić w dowolnym miejscu pliku, na przykład:

[email protected] 

Teraz chcę zamienić [email protected] na [email protected]. Muszę wyszukać wiersz, w którym mogę znaleźć słowo kluczowe RESOURCE, a następnie zamienić słowo po znaku równości. Słowo kluczowe RESOURCE musi pozostać niezmienione.

Czy ktoś mógłby mi w tym pomóc?

dane wejściowe:

[email protected] 

Wyjście:

[email protected] 

Odpowiedź

grep nie jest użyteczne w tym przypadku, ponieważ nie pozwala na modyfikowanie zawartości pliku.

Zamiast tego można użyć sed tak:

fromaddr="[email protected]" toaddr="[email protected]" sed "/^RESOURCE=/s/=""$fromaddr""$/=""$toaddr""/" file >newfile 

Biorąc pod uwagę file jako

some data [email protected] [email protected] [email protected] [email protected] more data 

tworzy to newfile jako

some data [email protected] [email protected] [email protected] [email protected] more data 

Wyrażenie sed wybierze wiersze zaczynające się od ciągu RESOURCE. W przypadku każdej takiej linii zastąpi adres e-mail, jeśli jest obecny w wierszu. Wzorzec użyty do podstawienia zapewnia dopasowanie = i zakończenie adresu na końcu linii.

Komentarze

  • Nie chcę na stałe kodować [email protected], powinno to być coś w rodzaju nasir37 @ yahoo .com. Chcę zastąpić innym, takim jak [email protected]. Powinien być dynamiczny – właśnie teraz Lakshminarayana edytuj
  • @Lakshminarayana Zobacz zaktualizowaną odpowiedź.
  • Nie chcę zapisz go ponownie w nowym pliku … ponieważ plik zawiera również inne dane. Jest jak poniżej.
  • @Lakshminarayana Następnie uruchom z sed -i, jeśli myślisz robi to ' poprawnie i nie ' nie przekierowuje do nowego pliku. I ' m generalnie unika używania sed -i, ponieważ ' jest nieprzenośny, a ponieważ jeśli utworzysz typ o, może zniszczyć Twoje oryginalne dane.
  • Rozumiem. jak mogę wyszukać wiersz, który ma słowo ZASOBÓW. Muszę go przeszukać w pliku, który zawiera inne dane i zastąpić go. Ponadto muszę przekazać nazwę pliku jako parametr

Odpowiedź

sed polecenie jest lepsze.

sed -i "s/[email protected]/[email protected]/" yourfile 

Powyższe działa w moim teście, ale jeśli chcesz to przetestować, możesz najpierw spróbować tego:

sed "s/[email protected]/[email protected]/" yourfile 

Spowoduje to zapisanie zmian na standardowe wyjście bez wpływu na plik.

Tak czy inaczej, daje żądaną zmianę:

[email protected] 

Jeśli wartość RESOURCE jest inna w pliku i chcesz ją zmienić na inną, to:

grep RESOURCE= yourfile 

Spowoduje to zwrócenie wiersza, w którym się znajduje, i wyświetlenie wartości.

Następnie możesz użyć

sed "s/[email protected]/[email protected]/" yourfile 

Na przyszłość ważne jest, aby wyjaśnić to wszystko w swoim pierwotnym pytaniu, aby uzyskać potrzebną pomoc bez tego całego rygoru.

Komentarze

  • Nie chcę na stałe kodować [email protected], powinno to być coś takiego jak [email protected]. Chcę zastąpić innym, na przykład [email protected]. bądź dynamiczny
  • Nie ' nie rozumiem, co masz na myśli. Twoje pytanie pokazuje, że chcesz, aby wynik był [email protected], który osiągną obie odpowiedzi. Co masz na myśli przez: " Nie chcę na stałe zakodować [email protected] "? i " powinno być dynamiczne "?
  • @Lakshminarayana Jeśli chcesz, aby faktycznie wprowadził zmiany w następnie użyj sed i, tak jak podałem w moim pierwszym poleceniu. Przetestuj najpierw za pomocą sed samego w drugim poleceniu, aby upewnić się, że ' robi to, co chcesz, a następnie użyj sed -i w moim pierwszym poleceniu, gdy ' upewniasz się, że działa.
  • mam na myśli, że nie chcę na stałe kodować im. sed ' s / RESOURCE = Lnreddy37 @ gmail.com / RESOURCE = reddy17777 @ gmail.com / ' twój plik. chcę przekazać to jak parametry zarówno wejściowe, jak i wyjściowe.a także chcę poszukać tej linii, w której mam ZASOBY i muszę ją zastąpić
  • @Lakshminarayana Następnie albo użyj odpowiedzi Kusalananda ' i podaj adresy e-mail do zmiennej lub grep RESOURCE= file, pobierz wyświetlony adres e-mail, a następnie użyj sed -i i zamień [email protected] i [email protected] z czymkolwiek tam jest i czymkolwiek chcesz.

Odpowiedz

Wygląda na to, że chcesz zamienić ciąg, który pojawia się po =, nieważne, co to jest na przykład , w przykładowych danych chcesz zastąpić [email protected]. Ale mówisz, że bez względu na to, jaki jest ciąg po =, chcesz go zastąpić [email protected] – najwyraźniej chcesz to zakodowane.

Jest kilka odmian tego, jak to zrobić. Najprostsze to

sed "s/RESOURCE=.*/[email protected]/" 

, które (podobnie jak wszystkie poniższe polecenia) wykorzystuje fakt, że .* oznacza „dopasuj cokolwiek jest tu”. Jeśli nie chcesz dwukrotnie wpisywać RESOURCE=, możesz skrócić powyższe do

sed "s/\(RESOURCE=\).*/\[email protected]/" 

, gdzie \(\) oznacza część szukanego ciągu jako grupę (możesz mieć do dziewięciu grup) i \1 oznacza zastąpienie przez pierwszą grupę.

Powyższe polecenia znajdą i zastąpią RESOURCE= wszędzie tam, gdzie pojawi się w wierszu. Na przykład dane wejściowe

# Lakshminarayana wants to change all occurrences of "RESOURCE=". [email protected] [email protected] [email protected] FOX RESOURCE=The quick brown fox # Comment: Originally line 2 said [email protected] 

zostaną zmienione na

# Lakshminarayana wants to change all occurrences of "[email protected] [email protected] [email protected] [email protected] FOX [email protected] # Comment: Originally line 2 said [email protected] 

Jeśli chcesz dopasować tylko wtedy, gdy RESOURCE= pojawia się na początku wiersza, użyj ^ :

sed "s/^RESOURCE=.*/[email protected]/" 

lub

sed "s/^\(RESOURCE=\).*/\[email protected]/" 

Jeśli chcesz zamienić tylko wartość zasobu, a nie całą resztę wiersza – np.

[email protected] [email protected] 

na

[email protected] [email protected] 

to też można zrobić. Edytuj swoje pytanie, aby wyrazić dokładnie to, czego chcesz, z pełnymi, jasnymi wyjaśnieniami i przykładami.


OK, wybierz jeden z powyższych s polecenia. Teraz, jeśli chcesz edytować swój plik w miejscu (jak wskazałeś), zrób

sed -i { s command } { yourfile }

Jeśli chcesz utworzyć nowy plik, zrób

sed { s command } { oldfile } > { newfile }

W rzeczywistości nie wpisuj { i } ; są tam tylko dla rozgraniczenia.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *