用于编辑一堆文件的Bash脚本

时间:2009-10-27 13:41:56

标签: bash batch-processing

为了处理大量数据并准备好插入我们的数据库,我们生成了一堆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 个答案:

答案 0 :(得分:4)

使用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"

您可能希望在对所有这些脚本运行之前对其进行测试...

编辑:更改了行号以反映评论。

答案 1 :(得分:3)

粗略地说:

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

假设您不关心检查比赛条件等。

答案 2 :(得分:1)

最终你会想要使用linux命令sed。无论你需要在脚本中放置什么逻辑,你都知道。但是你的脚本最终会调用sed。 http://lowfatlinux.com/linux-sed.html

答案 3 :(得分:1)

ex似乎是为了你想做的事。

例如,要编辑一个文件,请使用以下文档:

#!/bin/sh

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

那将在“test.txt”中注释掉前12行。对于您的示例,您可以尝试"$FILE"或类似(包括引号!)。

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

编辑:$SHELL "$FILE"可能是一种更好的方法来运行它们(来自上述评论者之一)。