Bash 对于CAT和tr的回路问题

Bash 对于CAT和tr的回路问题,bash,Bash,我有大约700个文本文件,其中包含使用各种特殊字符的配置输出。我使用这个脚本来删除特殊字符,这样我就可以运行一个引用SED文件的不同脚本来删除应该在那里的命令,而不应该在配置中。 我是从下面得到的,但我碰到了墙 当我运行脚本时,它会继续循环并将脚本写入输出文件。理想情况下,它只需取出特殊字符并创建一个包含更新信息的新文件。我还没有达到删除上一个文本文件的目的,因为它可能不需要。非常感谢您的任何见解 for file in *.txt for file in *.txt do cat * |

我有大约700个文本文件,其中包含使用各种特殊字符的配置输出。我使用这个脚本来删除特殊字符,这样我就可以运行一个引用SED文件的不同脚本来删除应该在那里的命令,而不应该在配置中。 我是从下面得到的,但我碰到了墙

当我运行脚本时,它会继续循环并将脚本写入输出文件。理想情况下,它只需取出特殊字符并创建一个包含更新信息的新文件。我还没有达到删除上一个文本文件的目的,因为它可能不需要。非常感谢您的任何见解

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

这种情况的一个不太坏的版本可能如下所示:

#!/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变量。 我们没有用猫。它会降低脚本的速度,但没有任何补偿好处。相反,使用使用GNU sed:


cat*|表示将当前目录中所有文件的内容发送到管道中。我很确定这不是你想要做的。而且,使用多个>>也没有意义。每次重定向都会更改标准输出。最后一个定义,也只有最后一个定义,才是赢家;以前的版本可能有副作用,比如创建以前不存在的文件,但它们不会改变输出的位置。@jhnc,三个倒勾就足够了。也许你在想新公约通过之前需要多少空间?@charlesduff不知道我从哪里得到了4个反勾。也许视力不好我使用了sed选项,它工作得很好。为了简单起见,我选择了这条路线,因为它将被许多不熟悉bash的人使用。sed选项非常有效。感谢大家的快速反应和洞察力。
sed -i 's/[^[:alnum:]\n\r]//g;s/./\l&/g' *.txt