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
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żyjsed -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żyjsed -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.
sed -i
, jeśli myślisz robi to ' poprawnie i nie ' nie przekierowuje do nowego pliku. I ' m generalnie unika używaniased -i
, ponieważ ' jest nieprzenośny, a ponieważ jeśli utworzysz typ o, może zniszczyć Twoje oryginalne dane.