代码之家  ›  专栏  ›  技术社区  ›  JJw

在bash脚本中运行vi并执行vi命令以编辑另一个文件

  •  6
  • JJw  · 技术社区  · 11 年前

    所以我制作了一个脚本,从许多不同的文件中收集数据:

    #!/bin/bash
    
    mkdir DATAPOOL"$1"
    
    grep achi *out>runner
    grep treat *out>>runner
    
    cat runner | grep Primitive *gout | grep '=   '|awk '{print $1,$6}' > CellVolume"$1".txt 
    cat runner | grep ' c ' *gout | grep 'Angstrom   '|awk '{print $1,$3}' > Cellc"$1".txt 
    cat runner | grep 'Final energy ' *gout |awk '{print $1,$5}' > CellEnergy"$1".txt
    

    等等

    cat runner |awk '{print "~/xtlanal",$1," > ",$1}' >runner2
    vi runner2
    :1,$s/gout:/xtl/
    :1,$s/gout:/dat/
    :wq
    
    source runner2
    
    grep Summary *dat | grep 'CAT-O  ' |awk '{print $1,$6}' > AVE_NaO_"$1".txt
    
    mv *txt DATAPOOL"$1"
    

    因此,在没有vi部分的情况下运行时,我最终得到了所有必需的文本文件,因此我知道这一切都有效。此外,当我使用vi命令运行它时,它只是在vi命令处停止运行,然后我可以手动输入3个命令,我最终得到正确的结果。我正在纠结的是,我无法让vi自己运行命令,所以我可以在不同的目录中多次执行文件,而不必一次又一次手动输入命令。

    如有任何帮助,将不胜感激。

    干杯

    3 回复  |  直到 11 年前
        1
  •  13
  •   Mike Ross B.Kocis    4 年前

    类似于bash脚本:

    #!/bin/bash
    vi filename.txt -c ':g/^/m0' -c ':wq'
    

    哪里 -c 执行命令。这里的命令是反转文本文件中的行。完成后, :wq 保存并退出。(man vi了解有关-c的更多信息)

    如果您不想键入 -c类 两次,你可以这样做:

    vi -c "g/^/m0 | wq" filename.txt
    
        2
  •  8
  •   glenn jackman    11 年前

    对于脚本编辑任务,可以使用 ed 而不是vi:

    ed runner2 <<'END'
    1,$s/gout:/xtl/
    1,$s/gout:/dat/
    w
    q
    END
    

    对于面向全局行的搜索和替换, sed 是个不错的选择:

    sed -i 's/gout:/xtl/; s/gout:/dat/' runner2
    
        3
  •  2
  •   mOmOney    4 年前

    在VIM上测试-Vi IMproven 8.0(2016年9月12日,编译于2018年4月10日21:31:58)

    这个 vi-c“g/^/m0|wq”文件名.txt 可能看起来有效,但实际上不是!

    打字 vi-c“g/^/m0|wq”文件名.txt 将导致vi在对文件进行任何重大更改之前写入并退出。(在这种情况下使用管道将尝试逐行执行wq,迫使其在预期操作之前退出)

    为了观看演示,请尝试在不带q的情况下键入它,并查看它逐行书写的速度有多慢:

    vi -c "g/^/m0 | w" filename.txt
    

    更有效的方法是使用-c作为B.Kocis状态,或使用+。

    如B.Kocis所述:

    #!/bin/bash
    vi filename.txt -c ':g/^/m0' -c ':wq'
    

    vi filename.txt +g/^/m0 +wq