2012-02-04 11 views
11

Chcę zmienić wszystkie słowa w tekście, które pasują do danego słowa z innym słowem w powłoce Bourne'a. Na przykład:Zamień słowo na inne w bash

hello sara, my name is sara too. 

staje:

hello mary, my name is mary too. 

Czy ktoś może mi pomóc?
Wiem, że grep znajduje podobne słowa, ale chcę je zastąpić innym słowem.

Odpowiedz

9

Czysta składnia bash:

before='hello sara , my name is sara too .' 
after=${before//sara/mary} 
echo $after 

LUB składnia sed:

sed 's/sara/mary/g' <<< $before 
echo $after 

WYJŚCIE:

hello mary , my name is mary too . 
+1

Łańcuch wejściowy powinien być lepiej nazwany czymś innym niż 's', aby uniknąć nieporozumień w' $ {sara/mary} 'i' 's/sara/mary/g''. – galath

6

Można użyć sed za to:

$ sed s/sara/mary/g <<< 'hello sara , my name is sara too .' 
hello mary , my name is mary too . 

Lub jeżeli chcesz zmienić plik na swoim miejscu:

$ cat FILE 
hello sara , my name is sara too . 
$ sed -i s/sara/mary/g FILE 
$ cat FILE 
hello mary , my name is mary too . 
3

Można użyć sed: wyjście

# sed 's/sara/mary/g' FILENAME 

woli wyniki. Konstrukcja s /// oznacza wyszukiwanie i zastępowanie za pomocą wyrażeń regularnych. "G" na końcu oznacza "każde wystąpienie" (nie tylko pierwsze).

Można również użyć Perl i edytować plik w lokalu:

# perl -p -i -e 's/sara/mary/g;' FILENAME 
+0

sed można również zrobić in-place-modyfikacji. –

+0

Nowsze, według GNU, tak. –

0

Trzeba użyć sed zastąpić słowa

1

Albo awk

awk '{gsub("sara","mary")}1' <<< "hello sara, my name is sara too."