2012-05-14 18 views
6

Chcę zastąpić pojedynczy wiersz w pliku z wieloma linii npzastąpić linię z wielu linii w pliku

Chcę wymienić konkretny wywołanie funkcji powiedzieć
foo(1,2)

z

if (a > 1) { 
    foo(1,2) 
} else { 
    bar(1,2) 
} 

Jak mogę to zrobić w bash?

+0

co, jeśli chcę zmienić go inplace w moim bieżącego pliku bez tworzenia dodatkowego pliku. – ravi

+0

@ravi Zobacz moje edycje. –

Odpowiedz

6

To właśnie sed polecenie s został zbudowany dla:

shopt -s extglob 

ORIG="foo(1,2)" 
REP="if (a > 1) { 
     foo(1,2) 
} else { 
     bar(1,2) 
}" 

REP="${REP//+(
)/\\n}" 

sed "s/$ORIG/$REP/g" inputfile > outputfile 

nocie że REP="${REP//\+( )/\\n}" linie są tylko potrzebne, jeśli chcesz określić REP w sformatowanym sposób, że zrobiłem na drugiej linii . Może być prostsze, jeśli użyjesz po prostu \n i \t w REP.

Edycja w odpowiedzi na pytanie OP

Aby zmienić oryginalny plik bez tworzenia nowego pliku, użycie sed na --in-place flaga, tak:

sed --in-place "s/$ORIG/$REP/g" inputfile 

Należy uważać z Flaga --in-place. Wykonuj kopie zapasowe przed uruchomieniem, ponieważ wszystkie zmiany będą trwałe.

+1

'shopt -s extglob' jest wymagany, a ukośnik przed znakiem plus musi zostać usunięty. –

+0

@DennisWilliamson Dzięki za złapanie tego. Czasami zapominam, że większość osób nie ma włączonego rozszerzonego globowania domyślnie. Odwrotny ukośnik pozostał po testowaniu. –

+0

Działa, ale nie jestem pewien, co to znaczy 'REP =" $ {REP // + ( )/\\ n} "' – ravi

1
ORIGINAL="foo(1,2)" 
REPLACEMENT="if (a > 1) { 
foo(1,2) 
} else { 
bar(1,2) 
}" 

while read line; do 
    if [ "$line" = "$ORIGINAL" ]; then 
    echo "$REPLACEMENT" 
    else 
    echo "$line" 
    fi 
done </path/to/your/file> /path/to/output/file 
0

To może pracować dla Ciebie:

cat <<\! | 
> a 
> foo(1,2) 
> b 
> foo(1,2) 
> c 
> ! 
> sed '/foo(1,2)/c\ 
> if (a > 1) {\ 
>  foo(1,2)\ 
> } else {\ 
>  bar(1,2)\ 
> }' 
a 
if (a > 1) { 
    foo(1,2) 
} else { 
    bar(1,2) 
} 
b 
if (a > 1) { 
    foo(1,2) 
} else { 
    bar(1,2) 
} 
c 
Powiązane problemy