递归地使文件中的所有文本小写的 Bash 脚本

标签 bash

我正在尝试编写一个 shell 脚本,它递归地遍历一个目录,然后在每个文件中将所有 Uppercase 字母转换为 lowercase 字母。明确地说,我不是要更改文件名,而是要更改文件中的文本。

注意事项:

  1. 这是一个旧的 Fortran 项目,我正在努力使其更易于访问
  2. 我不想创建新文件,而是用更改覆盖旧文件
  3. 该目录下有几个不同的文件扩展名,包括.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/

相关文章:

windows - Bash 函数自动执行未按预期执行的 curl POST 身份验证

macos - 无法清除 OS X El Capitan 中的 Bash 终端历史记录

c - linux下如何加速连续程序启动?

linux - 当检测到特定输出时自动取消二进制执行

Linux - 将部分输出重定向到文件

linux - 检查是否存在与目录同名的文件

linux - 输出到文件时如何设置输出缓冲区宽度/列?

linux - Linux 超时命令和退出代码

linux - Bash 脚本 - 无法解析代码 "Help"错误

bash - 当没有正在运行的 session 时,Tmux 无法连接到 `tmux ls` 上的服务器错误