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?
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?
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.
'shopt -s extglob' jest wymagany, a ukośnik przed znakiem plus musi zostać usunięty. –
@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. –
Działa, ale nie jestem pewien, co to znaczy 'REP =" $ {REP // + ( )/\\ n} "' – ravi
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
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
co, jeśli chcę zmienić go inplace w moim bieżącego pliku bez tworzenia dodatkowego pliku. – ravi
@ravi Zobacz moje edycje. –