对于CAT和tr的循环问题

时间:2019-02-06 02:41:38

标签: bash

我有大约700个文本文件,这些文件由使用各种特殊字符的config输出组成。我正在使用此脚本删除特殊字符,因此我可以运行另一个引用SED文件的脚本,以删除应该存在的命令,而保留配置中不存在的命令。 我从Remove all special characters and case from string in bash得到了下面的东西,但是碰到了墙。

当我运行脚本时,它将继续循环并将脚本写入输出文件。理想情况下,它只是去掉特殊字符并使用更新的信息创建一个新文件。我还没想删除以前的文本文件,因为可能不需要它了。任何见解都将不胜感激。

for file in *.txt for file in *.txt
do
   cat * | tr -cd '[:alnum:]\n\r' | tr '[:upper:]' '[:lower:]' >> "$file" >> "$file".new_file.txt
done 

2 个答案:

答案 0 :(得分:1)

一个比较完整的版本看起来像:

#!/usr/bin/env bash
for file in *.txt; do
 [[ $file = *.new_file.txt ]] && continue ## skip files created by this same script
 tr -cd '[:alnum:]\n\r' <"$file" \
   | tr '[:upper:]' '[:lower:]' \
   >> "$file".new_file.txt
done

注意:

  • 我们指的是"$file"设置的for变量。
  • 我们没有使用cat。它减慢了脚本速度,没有任何补偿性好处。相反,使用<"$file"从当前正在迭代的特定输入文件重定向。
  • 我们正在跳过扩展名为.new_file.txt的文件。
  • 我们只有一个 输出重定向(到文件的new_file.txt版本;您不能安全地写到在同一管道中用作输入的文件)。

答案 1 :(得分:0)

使用 GNU sed

sed -i 's/[^[:alnum:]\n\r]//g;s/./\l&/g' *.txt