Mám soubor, který má klíčové slovo RESOURCE. Může se vyskytovat kdekoli v souboru, například:

[email protected] 

Nyní chci nahradit [email protected] znakem [email protected]. Musím vyhledat řádek, kde najdu klíčové slovo RESOURCE a poté slovo nahradit za znaménkem rovná se. Klíčové slovo RESOURCE musí zůstat nezměněno.

Mohl by mi někdo s tím prosím pomoci?

Vstup:

[email protected] 

Výstup:

[email protected] 

Odpověď

grep není v tomto případě užitečný, protože vám neumožňuje upravit obsah souboru.

Místo toho můžete použít sed takto:

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

Vzhledem k file jako

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

Tím se vytvoří newfile as

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

Výraz sed vybere řádky začínající řetězcem RESOURCE. Pro každý takový řádek nahradí e-mailovou adresu, pokud je na řádku uvedena. Použitý vzor pro nahrazení zajistí, že se shodujeme s = a že adresa končí na konci řádku.

Komentáře

  • Nechci pevně kódovat [email protected], mělo by to být něco jako nasir37 @ yahoo .com. Chci nahradit jakýmkoli jiným, jako je [email protected]. mělo by to být dynamické – Lakshminarayana právě teď upravovat
  • @Lakshminarayana Viz aktualizovanou odpověď.
  • Nechci znovu jej zapište do nového souboru .. protože soubor se skládá také z dalších dat. Podobně jako níže.
  • @Lakshminarayana Pak spusťte s sed -i, pokud si myslíte ' dělá správnou věc a nepřesměruje ' na nový soubor. ' m se obecně vyhýbá používání sed -i, protože je ' nepřenosné a protože pokud uděláte typ o, může to zničit vaše původní data.
  • Rozumím tomu. Jak mohu vyhledat řádek, který má slovo ZDROJ. Musím to prohledat v souboru, který má jiná data, a musím je nahradit. Kromě toho musím předat název souboru jako parametr

Odpověď

sed příkaz je lepší.

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

Výše uvedené funguje v mém testu, ale pokud ho chcete otestovat sami, můžete nejprve vyzkoušet tento:

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

Tím se zapíší změny standardního výstupu, aniž by to ovlivnilo soubor.

Ať tak či onak, poskytne požadovanou změnu:

[email protected] 

Pokud je hodnota RESOURCE v souboru jiná a chcete ji změnit něco jiného než:

grep RESOURCE= yourfile 

Tím se vrátí řádek tam, kde je, a zobrazí se hodnota.

Potom můžete použít

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

Pro budoucí potřebu je důležité vše objasnit ve své původní otázce, abyste mohli získat potřebnou pomoc bez všech těchto rigamarol.

Komentáře

  • Nechci pevně kódovat [email protected], mělo by to být něco jako [email protected]. Chci nahradit jakýmkoli jiným, jako je [email protected]. mělo by být dynamický
  • Nerozumím ' tomu, co máte na mysli. Ve vaší otázce to ukazuje, že chcete, aby výstup byl [email protected] čehož obě odpovědi dosáhnou. Co tím myslíš: " Nechci pevně kódovat [email protected] "? a " mělo by to být dynamické "?
  • @Lakshminarayana Pokud chcete, aby změny provedly soubor a poté použijte sed i, jako jsem uvedl ve svém prvním příkazu. Nejprve to vyzkoušejte pomocí sed v mém druhém příkazu, abyste se ujistili, že ' dělá to, co chcete, a pak použijte sed -i v mém prvním příkazu, jakmile si ' ujistíte, že to funguje.
  • Chci říct, že nechci pevný kód jim. sed ' s / RESOURCE = Lnreddy37 @ gmail.com / RESOURCE = reddy17777 @ gmail.com / ' váš soubor. Chci to předat jako parametry vstupu i výstupu.a také chci vyhledat ten řádek, kde mám ZDROJ a musím ho nahradit
  • @Lakshminarayana Pak buď použijte odpověď Kusalananda ' a předejte e-mailové adresy do proměnné nebo grep RESOURCE= file získat zobrazenou e-mailovou adresu a poté použít sed -i a nahradit [email protected] a [email protected] s tím, co tam je a co chcete.

Odpovědět

Zdá se, že říkáte, že chcete nahradit řetězec, který se objeví za =, bez ohledu na to například , v ukázkových datech chcete nahradit [email protected]. Ale říkáte to, bez ohledu na to, jaký řetězec po = je, chcete jej nahradit [email protected] – zjevně chcete že napevno.

Existuje několik variant, jak to udělat. Nejjednodušší je

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

, který (stejně jako všechny níže uvedené příkazy) využívá skutečnosti, že .* znamená „shodovat se s čímkoli“ je tady“. Pokud nechcete psát RESOURCE= dvakrát, můžete toto zkrátit na

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

where \(\) označí část vyhledávaného řetězce jako skupinu (můžete mít až devět skupin) a \1 znamená nahradit první skupinou.

Výše uvedené příkazy naleznou a nahradí RESOURCE= kdekoli na řádku. Například vstup

# 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] 

by se změnil 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] 

Pokud chcete se shodovat, pouze když se RESOURCE= objeví na začátku řádku, použijte ^ :

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

nebo

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

Pokud chcete nahradit pouze hodnotu zdroje, a ne celý zbytek řádku – např.

[email protected] [email protected] 

to

[email protected] [email protected] 

to lze také provést. Upravte svou otázku tak, aby vám řekla přesně to, co chcete, s úplnými a jasnými vysvětleními a příklady.


Dobře, vyberte jednu z výše uvedených s příkazy. Nyní, pokud chcete upravit soubor na místě (jak jste uvedli), udělejte

sed -i { s command } { yourfile }

Pokud chcete vytvořit nový soubor, udělejte

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

Nezadávejte ve skutečnosti { a } ; jsou tam jen pro vymezení.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *