用shell中的sed替换文本

时间:2016-09-12 15:57:25

标签: bash shell sed sh

就像这里的其他一些问题一样,我正在尝试使用sed来替换文件中的文本。这是在sh脚本的上下文中我用来运行分析代码(可执行文件:“turns2d_over”)多次,每次运行后稍微修改输入(包含在文件“steady”中)。我试图替换的特定行如下所示,其中X.X是一个数字:

ALFA = X.X EXPLANATION

但是......而不是用ALFA = YY(一个不同的数字)替换ALFA = XX,sed要么什么也不做,或者在我放入下面的情况下(这是我当前的sh脚本的副本),它会删除整个文件中的所有文本......这是无用的。

    TOT_VALS=9
    ALPHAS[1]=-2.0
    ALPHAS[2]=0.0
    ALPHAS[1]=2.2
    ALPHAS[4]=4.5
    ALPHAS[5]=6.3
    ALPHAS[6]=8.3
    ALPHAS[7]=10.2
    ALPHAS[8]=12.2
    ALPHAS[9]=14.4

    cd ./naca0008

    for VAL in $(seq 1 $TOT_VALS); do
        sed -n -i 's/ALFA = .*/ALFA = '${ALPHAS[$VAL]}'/g' steady

        ./turns2d_over<steady

        mv 'fort.1' 'grid_in' # rename input grid to save from bulk move
        mv 'fort.8' 'fort.q' # rename soln & grid outputs
        mv 'fort.9' 'fort.g'
        mkdir ./'alfa='${ALPHAS[$VAL]}/; mv 'fort.'* *'.dat' $_ # move files
        cp 'steady' $_
        mv 'grid_in' 'fort.1' # ready input grid for next run
 done

那是怎么回事?

1 个答案:

答案 0 :(得分:1)

您需要删除-n或在sed命令末尾添加p。 -n表示sed不会自动打印模式空间(p将打印当前匹配)。

如果你想让sed单独保留文件的其余部分(稳定),那么删除-n。

sed -i 's/ALFA = .*/ALFA = '${ALPHAS[$VAL]}'/g' steady

如果您希望sed删除文件的其余部分(稳定)并仅打印匹配的ALFA行,请像这样添加p:

sed -n -i 's/ALFA = .*/ALFA = '${ALPHAS[$VAL]}'/gp' steady