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
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žijtesed -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žítsed -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í.
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.