我正在尝试编写一个 shell 脚本,它递归地遍历一个目录,然后在每个文件中将所有 Uppercase 字母转换为 lowercase 字母。明确地说,我不是要更改文件名,而是要更改文件中的文本。
注意事项:
- 这是一个旧的 Fortran 项目,我正在努力使其更易于访问
- 我不想创建新文件,而是用更改覆盖旧文件
- 该目录下有几个不同的文件扩展名,包括.par .f .txt 等
解决此问题的最佳方法是什么?
最佳答案
要将文件从小写转换为大写,您可以使用 ex
(ed
的好 friend ,标准编辑器):
ex -s file <<EOF
%s/[[:upper:]]\+/\L&/g
wq
EOF
或者,如果您喜欢一行内容:
ex -s file <<< $'%s/[[:upper:]]\+/\L&/g\nwq'
结合find
,你可以做:
find . -type f -exec bash -c "ex -s -- \"\$0\" <<< $'%s/[[:upper:]]\+/\L&/g\nwq'" {} \;
对于文件名中的空格和有趣的符号,此方法是 100% 安全的。没有创建、复制或移动辅助文件;文件仅被编辑。
编辑。
使用 glenn jackmann的建议,你也可以这样写:
find . -type f -exec bash -c 'printf "%s\n" "%s/[[:upper:]]\+/\L&/g" "wq" | ex -- -s "$0"' {} \;
(优点是它避免了尴尬的转义;缺点是它更长)。
关于递归地使文件中的所有文本小写的 Bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13593352/