使用 read 而不丢失 TAB

使用 read 而不丢失 TAB

我使用 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/第一次出现的 替换为。为了确保我们在整行上工作,我添加了(行首) 和(行尾)。foobar^$

您可以在命令前添加选择器。在这种情况下(第二个 -e),该s命令仅适用于与 匹配的行^FFLAGC=-Wall -O$

您甚至可以使用-i标志来替换文件:

sed -i -e 's/^FCOMPL=g77$/FCOMPL=gfortran/' \
       -e '/^FFLAGC=-Wall -O$/s/$/ -fno-backslash/' makefile

相关内容