Я использую чтение в цикле while для автоматической смены make-файла после загрузки.
Вот часть сценария,
while read a; do
if [[ "$a" = "FCOMPL=g77" ]]
then echo "FCOMPL=gfortran" >> makefile
elif [[ "$a" = "FFLAGC=-Wall -O" ]]
then echo "FFLAGC=-Wall -O -fno-backslash" >> makefile
else
echo $a >> makefile
fi
done <makefile.orig
Проблема в том, что я теряю табуляцию.
Есть идеи, как мне этого избежать?
Вместо того чтобы использовать bash для выполнения этой задачи, вы можете выучить sed
:
sed -e 's/^FCOMPL=g77$/FCOMPL=gfortran/' \
-e '/^FFLAGC=-Wall -O$/s/$/ -fno-backslash/' makefile.orig > makefile
Каждый -e
дает sed
команду для выполнения. В этом случае (1-е) команда s
выполняет замену : s/foo/bar/
заменяет первое вхождение foo
в каждой строке на bar
. Чтобы убедиться, что мы работаем над полной линией, я добавил ^
(начало строки) и $
(конец строки).
Вы можете добавить команду к префиксу. В этом случае (2-е) команда s
применяется только к строке, совпадающей с ^FFLAGC=-Wall -O$
.
Вы даже можете использовать флаг -i
для замены файла:
sed -i -e 's/^FCOMPL=g77$/FCOMPL=gfortran/' \
-e '/^FFLAGC=-Wall -O$/s/$/ -fno-backslash/' makefile
Нашли решение !! Я применил то, чему здесь учат http://en.kioskea.net/faq/1757-how-to-read-a-file-line-by-line
old_IFS=$IFS # save the field separator
IFS=\n' # new field separator, the end of line
(code)
IFS=$old_IFS # restore default field separator