关于bash:用于CAT和tr的循环问题

For Loop Issues with CAT and tr

我有大约700个文本文件,其中包含使用各种特殊字符的配置输出。我使用这个脚本删除特殊字符,这样我就可以运行一个引用SED文件的不同脚本来删除应该存在的命令,而不应该保留在配置中。下面是我在bash中从字符串中删除所有特殊字符和大小写的内容,但我正在碰壁。

当我运行脚本时,它继续循环并将脚本写入输出文件。理想情况下,它只需要去掉特殊字符并创建一个包含更新信息的新文件。我还没有达到删除以前的文本文件的目的,因为可能不需要它。任何见解都会受到高度赞赏。

1
2
3
4
5
6
for file in *.txt for file in *.txt
do
   cat * | tr -cd '[:alnum:]

'
| tr '[:upper:]' '[:lower:]' >>"$file">>"$file".new_file.txt
done


一个不那么破碎的版本可能看起来像:

1
2
3
4
5
6
7
8
9
#!/usr/bin/env bash
for file in *.txt; do
 [[ $file = *.new_file.txt ]] && continue ## skip files created by this same script
 tr -cd '[:alnum:]

'
<"$file" \
   | tr '[:upper:]' '[:lower:]' \
   >>"$file".new_file.txt
done

注:

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

使用GNU sed

1
2
3
sed -i 's/[^[:alnum:]

]//g;s/./\l&/g'
*.txt