我正在尝试编写一个 bash 队列,它将能够从文件加载命令集,然后在一组文件上执行每个命令集。准备好的文件应作为在手动 bash 队列中执行的模板
准备好的文件sed.sh
:(
我在文件中也有注释,但我不知道如何在此处添加它们)
sed -e 's,something_complex_long,something_even_longer,'
sed -e 's,other_complex_long_thing,something_so_much_longer,'
sed -e 's,another_long_stuff,something_hell_long,'
并且有一个目录,其中包含一组相当大的文件,这些文件具有通用名称,例如aa
ab
ac
等(使用 split 切成更大的文件)
所以我尝试:
sedie=\`grep -v -e '^#' ../../sed.sh\`
for i in *
do
for b in $sedie
do
cat $i | $b > ${i}.new
mv ${i}.new $i
done
done
这当然完全失败了,因为第二个用空格for
打破了语句。$sedie
然后我尝试继续使用IFS
我在某个地方找到的东西,但仍然没有太大进展。然后我想我应该将命令加载到某种数组中以帮助区分我想要的内容......也许sed.sh
像arr=("sed " "sed " "sed ")
然后源sed.sh
然后然后for b in ${arr[*]}
?
有人知道如何以优雅的方式(例如,可重用)手动处理这个问题吗?
我的IFS
尝试相当麻烦,而且无论如何都不起作用...$b
变成了一条语句,包括空格和所有内容,并且没有这样的命令
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
sedie=\`grep -v -e '^#' ../../sed.sh\`
for i in *
do
for b in $sedie
do
echo cat $i \| $($b) \> ${i}.new
echo mv ${i}.new $i
done
done
IFS=$SAVEIFS
这一点也不优雅。
更新#1
使用这个问题:使用 bash 脚本将文件内容提取到数组中 和这个:如何执行存储在变量中的命令?,现在我能够..
$ cat > myfile
aaaaaaaa
aaaaaaa
aaaaaa
aaaa
aa
aaaa
$ cat sed.sh
sed -e 's/a/b/g'
sed -e 's/b/c/g'
sed -e 's/c/f/g'
$ declare -a pole
$ readarray pole < sed.sh
$ for ((i=0;i<${#pole[@]};i++));do \
eval ${pole[i]} xfile > xfile.b; mv xfile.b xfile; done;
$ cat xfile
ffffffff
fffffff
ffffff
ffff
ff
ffff
这几乎就是我所需要的。所以我的问题基本上有两个:
如何将文件读入数组?
和
如何执行变量中的命令?
答案1
这可能不完全是您想要的,但由于您似乎正在使用 sed,因此您可以创建一个文件 sed.cmd ,其中仅包含您想要执行的 sed 命令。
s,something_complex_long,something_even_longer,
s,other_complex_long_thing,something_so_much_longer,
s,another_long_stuff,something_hell_long,
我在测试 sed.cmd 中使用了以下内容
s/dog/cat
然后创建一个脚本,将这些命令读入数组并调用 sed 传入这些命令
array=()
# Read the file in parameter and fill the array named "array"
getArray() {
i=0
while read line # Read a line
do
array[i]=$line # Put it into the array
i=$(($i + 1))
done < $1
}
getArray "sed.cmd"
for cmd in "${array[@]}"
do
ls -1 | while read line
do
cat $line | sed -e $cmd > ${line}.new
mv ${line}.new $line
done
done
您可能想要更改 ls 命令来对文件进行排序,但以上内容似乎满足您的要求。