0

为了处理一堆数据并准备好将其插入到我们的数据库中,我们生成了一堆 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

4 回答 4

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"

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

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

于 2009-10-27T13:58:00.753 回答
3

大致说来:

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

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

于 2009-10-27T14:03:12.177 回答
1

ex 似乎是为你想做的事而生的。

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

#!/bin/sh

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

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

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

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

于 2009-10-27T14:21:38.487 回答
1

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

于 2009-10-27T14:03:03.877 回答