我有大约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
答案 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