每行从文件加载 bash 命令并为目录中的每个文件执行它们

每行从文件加载 bash 命令并为目录中的每个文件执行它们

我正在尝试编写一个 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.sharr=("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 命令来对文件进行排序,但以上内容似乎满足您的要求。

相关内容