我正在尝试编写一个递归遍历目录的shell脚本,然后在每个文件中将所有大写字母转换 为小写字母.要清楚,我不是要更改文件名,而是更改文件中的文本.
注意事项:
最好的方法是什么?
要将文件从小写转换为大写,您可以使用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)
(专业人士认为它可以避免尴尬的逃脱;这是因为它更长).