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

有帮助吗?

解决方案

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

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

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

其他提示

粗略地说:

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

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

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

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

#!/bin/sh

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top