为了处理大量数据并准备好插入我们的数据库,我们生成了一堆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开头
答案 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"
可能是一种更好的方法来运行它们(来自上述评论者之一)。