GNU/Linux >> Znalost Linux >  >> Linux

Nahrazení podřetězce jiným řetězcem v Bash

Zde je scénář. Máte velký řetězec a chcete jeho část nahradit jiným řetězcem.

Chcete například změnit „dnes píšu řádek " až " teď píšu řádek ".

."

V tomto rychlém tutoriálu vám ukážu, jak nativně nahradit podřetězec v Bash. Ukážu také příklad příkazu sed jako rozšíření.

Nahradit podřetězec nativně v bash (vhodné pro jeden řádek)

Bash má některé vestavěné metody pro manipulaci s řetězci. Pokud chcete nahradit část řetězce jinou, postupujte takto:

${main_string/search_term/replace_term}

Vytvořte řetězcovou proměnnou sestávající z řádku:„Dnes píšu řádek“ bez uvozovek a poté nahraďte today s now :

[email protected]:~$ line="I am writing a line today"
[email protected]:~$ echo "${line/today/now}"
I am writing a line now

Rozuměl jsi tomu, co se právě stalo? V syntaxi "${line/today/now}" , line je název proměnné, kam jsem právě uložil celou větu. Zde mu dávám pokyn, aby nahradil první výskyt slova today s now . Takže místo zobrazení obsahu původní proměnné vám to ukázalo řádek se změněným slovem.

Tedy line proměnná se ve skutečnosti nezměnila. Je to stále stejné:

[email protected]:~$ echo $line
I am writing a line today

Rozhodně však můžete nahradit slovo, které chcete, a upravit stejnou proměnnou, aby byly změny trvalé:

[email protected]:~$ line="${line/today/now}"
[email protected]:~$ echo $line
I am writing a line now

Nyní byly změny provedeny jako trvalé a tak můžete trvale nahradit první výskyt podřetězce v řetězci.

Můžete také použít jiné proměnné k uložení konkrétních podřetězců, které chcete nahradit:

[email protected]:~$ replace="now"
[email protected]:~$ replacewith="today"
[email protected]:~$ line="${line/${replace}/${replacewith}}"
[email protected]:~$ echo $line
I am writing a line today

Zde jsem uložil slovo, které má být nahrazeno, do proměnné s názvem replace a slovo, kterým by bylo nahrazeno uvnitř replacewith . Poté jsem použil stejnou metodu, jaká byla popsána výše, k „revizi“ čáry. Nyní byly změny, které jsem provedl na začátku tohoto tutoriálu, vráceny zpět.

Podívejme se na další příklad:

[email protected]:~$ hbday="Happy Birthday! Many Many Happy Returns!"
[email protected]:~$ hbday="${hbday/Many/So Many}"
[email protected]:~$ echo $hbday
Happy Birthday! So Many Many Happy Returns!

Nahrazení všech výskytů dílčího řetězce

Můžete také nahradit více výskytů podřetězců uvnitř řetězců. Podívejme se na to na dalším příkladu:

[email protected]:~$ hbday="${hbday//Many/So Many}"
[email protected]:~$ echo $hbday
Happy Birthday! So Many So Many Happy Returns!

Ten extra / po hbday způsobil, že nahradil všechny výskyty Many s So Many uvnitř věty.

Nahradit řetězec pomocí příkazu sed (může fungovat i se soubory)

Zde je další způsob, jak nahradit podřetězce v řetězci v bash. Použijte příkaz sed tímto způsobem:

Nahradit první výskyt:

line=$(sed "s/$replace/s//$replacewith/" <<< "$line")

Pokud vezmu první příklad, lze jej přehrát jako:

Všechny výskyty můžete také nahradit přidáním g na konci:

line=$(sed "s/$replace/$replacewith/g" <<< "$line")

Nyní si můžete myslet, že je to složitější než nativní metoda bashových strun. Možná, ale sed je velmi výkonný a můžete jej použít k nahrazení všech výskytů řetězce v souboru.

sed -i 's/$replace/$replacewith/' filename

Zde je příklad některých knih Agathy Christie s „Vražda“ v názvu:

[email protected]:~$ cat agatha.txt 
The Murder in the Vicarage
Murder in Mesopotamia
Murder is Easy
Murder on the Orient Express
Murder In Retrospect

Nahradím Vraždu Manželstvím, protože někteří lidé si myslí, že obojí je stejné:

sed -i "s/Murder/Marriage/g" agatha.txt

A zde je nyní změněný soubor:

The Marriage in the Vicarage
Marriage in Mesopotamia
Marriage is Easy
Marriage on the Orient Express
Marriage In Retrospect

Sed je velmi výkonný nástroj pro úpravu textových souborů v Linuxu. Měli byste se naučit alespoň jeho základy.

Líbilo se vám čtení tohoto článku? Pokud se chcete o výměnu řetězců nebo o tomto článku podělit, udělejte to prosím v komentářích níže.


Linux
  1. Jak nahradit řetězec řetězcem obsahujícím lomítko se Sed?

  2. Jak napsat víceřádkový řetězec pomocí Bash s proměnnými?

  3. příkaz tr - jak nahradit řetězec \n skutečným novým řádkem (\n)

  1. Bash -c s pozičními parametry?

  2. Jak nahradím jednoduché uvozovky jiným znakem v sed?

  3. nahradit řádky v jednom souboru řádky v jiném číslem řádku

  1. Jak zkontrolovat, zda řetězec obsahuje podřetězec v Bash

  2. Příklady manipulace s bashovým řetězcem – délka, podřetězec, najít a nahradit

  3. Alias ​​s proměnnou v bash