Использование чтения без потери вкладки

Я использую чтение в цикле 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

Проблема в том, что я теряю табуляцию.

Есть идеи, как мне этого избежать?

5
задан 13 March 2013 в 19:25

2 ответа

Вместо того чтобы использовать 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
0
ответ дан 13 March 2013 в 19:25

Нашли решение !! Я применил то, чему здесь учат 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 
0
ответ дан 13 March 2013 в 19:25

Другие вопросы по тегам:

Похожие вопросы: