我使用 while 循环中的读取来在下载后自动更改 makefile。
以下是脚本的一部分,
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
问题是我丢失了制表符。
有什么想法可以避免这种情况吗?
答案1
找到解决方案了!我运用了这里教的内容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
答案2
除了使用 bash 来完成任务之外,您还可以学习sed
:
sed -e 's/^FCOMPL=g77$/FCOMPL=gfortran/' \
-e '/^FFLAGC=-Wall -O$/s/$/ -fno-backslash/' makefile.orig > makefile
每个命令都-e
给出sed
要执行的命令。在本例中 (第一个 -e),s
命令执行代换:将每行中s/foo/bar/
第一次出现的 替换为。为了确保我们在整行上工作,我添加了(行首) 和(行尾)。foo
bar
^
$
您可以在命令前添加选择器。在这种情况下(第二个 -e),该s
命令仅适用于与 匹配的行^FFLAGC=-Wall -O$
。
您甚至可以使用-i
标志来替换文件:
sed -i -e 's/^FCOMPL=g77$/FCOMPL=gfortran/' \
-e '/^FFLAGC=-Wall -O$/s/$/ -fno-backslash/' makefile