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
1 2 3 | sed -i 's/[^[:alnum:] ]//g;s/./\l&/g' *.txt |