代码之家  ›  专栏  ›  技术社区  ›  David Oneill

编辑一堆文件的bash脚本

  •  0
  • David Oneill  · 技术社区  · 15 年前

    为了处理一堆数据并准备好插入数据库,我们生成了一堆shell脚本。每一行大约有15行,每个数据表对应一行。一个最近的导入批处理中,一些导入文件未能进入一个特定的表。所以,我有一堆shell脚本(大约600个),需要注释掉前7行,然后重新运行文件。在这个文件夹中有大约6000个shell脚本,并且关于特定文件的任何内容都不能告诉我它是否需要编辑。我有一个从数据库输出中提取的文件列表。

    那么,如何编写bash脚本(或者其他更好的脚本)来获取文件名列表,并为每个文件名注释掉前7行,然后运行脚本?

    编辑:

    #!/usr/bin/env sh
    
    cmd1
    cmd2
    cmd3
    cmd4
    cmd5
    cmd6
    cmd7
    cmd8
    

    不知道那有多可读。基本上,前7行(不包括第一行)需要在它们的开头添加一个。注意:这些文件已经过编辑,使每一行变短,并部分切断了vim的复制。但是在每个文件的主要部分,有一行以echo开头,然后是一行以sqlldr开头

    4 回复  |  直到 15 年前
        1
  •  4
  •   Buggabill    15 年前

    使用SED,可以指定要更改的文件中的行号范围。

    #!/bin/bash
    
    while read line
    do
        # add a comment to beginning of lines 1 - 7 and rename the script
        sed '3,9 s/^/#/' $line > $line.new
        exec $line.new
    done < "filelist.txt"
    

    在所有这些脚本上运行之前,您可能希望测试它…

    编辑:更改行号以反映注释。

        2
  •  3
  •   Dean Povey    15 年前

    粗略地说:

    #!/bin/sh
    for file in "$@"
    do
        out=/tmp/$file.$$
        sed '2,8s/^/#/' < $file > $out
        $SHELL $out
        rm -f $out
    done
    

    假设你不在乎检查比赛情况等。

        3
  •  1
  •   wds    15 年前

    前男友似乎很适合你。

    例如,对于编辑一个文件,使用here文档:

    #!/bin/sh
    
    ex test.txt << END
    1,12s/^/#/
    wq
    END
    

    这将注释掉“test.txt”中的前12行。以你为例,你可以试试 "$FILE" 或类似的(包括引号!).

    然后按通常的方式运行它们,即。 ./"$FILE"

    编辑: $SHELL "$FILE" 可能是运行它们的更好方法(来自上面的一个注释者)。

        4
  •  1
  •   Paul Stephenson    15 年前

    最终,您将希望使用linux命令sed。不管你需要在剧本里加入什么逻辑,你知道的。但你的脚本最终会调用sed。 http://lowfatlinux.com/linux-sed.html