Bash脚本以递归方式使文件中的所有文本都为小写

Loo*_*urr 2 bash

我正在尝试编写一个递归遍历目录的shell脚本,然后在每个文件中将所有大写字母转换 为小写字母.要清楚,我不是要更改文件名,而是更改文件中的文本.

注意事项:

  1. 这是一个古老的Fortran项目,我试图让它更容易访问
  2. 我不想创建一个新文件,而是使用更改来覆盖旧文件
  3. 此目录中有几个不同的文件扩展名,包括.par .f .txt和其他

最好的方法是什么?

gni*_*urf 5

要将文件从小写转换为大写,您可以使用ex(ed标准编辑器的好朋友):

ex -s file <<EOF
%s/[[:upper:]]\+/\L&/g
wq
EOF
Run Code Online (Sandbox Code Playgroud)

或者,如果你喜欢一行的东西:

ex -s file <<< $'%s/[[:upper:]]\+/\L&/g\nwq'
Run Code Online (Sandbox Code Playgroud)

结合find,你可以做:

find . -type f -exec bash -c "ex -s -- \"\$0\" <<< $'%s/[[:upper:]]\+/\L&/g\nwq'" {} \;
Run Code Online (Sandbox Code Playgroud)

对于文件名中的空格和有趣符号,此方法是100%安全的.没有创建,复制或移动辅助文件; 文件仅被编辑.

编辑.

使用格伦·杰克曼的建议,你也可以写:

find . -type f -exec bash -c 'printf "%s\n" "%s/[[:upper:]]\+/\L&/g" "wq" | ex -- -s "$0"' {} \;
Run Code Online (Sandbox Code Playgroud)

(专业人士认为它可以避免尴尬的逃脱;这是因为它更长).