菜鸟科技网

Ubuntu下如何高效替换文件内容?

批量重命名文件(替换文件名)

这是最常见的“替换”需求之一。rename 命令是专门为此设计的,但它的语法有两种主流版本,在使用前务必确认你的系统是哪一种

Ubuntu下如何高效替换文件内容?-图1
(图片来源网络,侵删)

方法 1: Perl 风格的 rename (功能最强大)

这是现代 Ubuntu 版本(如 18.04+)中默认的版本,功能非常强大,使用 Perl 表达式。

语法: rename 's/搜索文本/替换文本/' 文件名模式

  • s 是 substitute (替换) 的意思。
  • 是分隔符,你也可以用其他字符, 或 ,当文件名中包含 时很有用。
  • 文件名模式 可以使用通配符,如 *.txt

示例:

  1. 将文件名中的 "old" 替换为 "new"

    Ubuntu下如何高效替换文件内容?-图2
    (图片来源网络,侵删)
    # 假设有文件: old_file1.txt, old_file2.txt, my_old_file.txt
    rename 's/old/new/' *
    # 执行后文件变为: new_file1.txt, new_file2.txt, my_new_file.txt
  2. 将下划线 _ 替换为连字符

    # 假设有文件: my_file_name.jpg
    rename 's/_/-/g' *.jpg
    # 执行后文件变为: my-file-name.jpg

    注意:这里的 g 是 global 的意思,表示替换一行中所有的匹配项,对于文件名来说,通常意味着替换所有匹配。

  3. 将文件名中的 "log" 替换为 "log_2025"

    rename 's/log/log_2025/' *.log
  4. 删除文件名中的所有数字

    Ubuntu下如何高效替换文件内容?-图3
    (图片来源网络,侵删)
    rename 's/[0-9]//g' *
    # [0-9] 是一个正则表达式,匹配任意一个数字

方法 2: prename (Perl rename 的别名)

rename 命令指向的是旧版本,你可以直接使用 prename 命令,它总是指向功能强大的 Perl 版本。

# 效果与上面的方法1完全相同
prename 's/old/new/' *

方法 3:使用 mvfor 循环 (最通用)

如果你的系统没有 rename 命令,或者你不熟悉它的语法,可以使用 for 循环配合 mv 命令,这种方法更直观,但稍显繁琐。

语法: for f in 文件名模式; do mv "$f" "${f//搜索文本/替换文本}"; done

  • "${f//.../...}" 是 Bash 的参数扩展功能,用于在变量中进行全局替换。

示例: 将所有 .txt 文件中的 "apple" 替换为 "orange"。

for f in *.txt; do mv "$f" "${f//apple/orange}"; done

替换文件内容

在文件中查找并替换文本是日常开发和管理中的核心操作。

方法 1:sed - 流编辑器 (最经典、最强大)

sed (Stream Editor) 是一个为处理文本流而设计的命令行工具,它可以读取文件、执行指定的操作(如替换),然后输出结果。

基本语法: sed 's/搜索文本/替换文本/g' 文件名

  • s 是 substitute。
  • g 是 global,表示替换文件中每一行的所有匹配项,如果没有 g,则只替换每行的第一个匹配项。
  • 默认情况下,sed 只是将结果输出到标准输出(屏幕),并不会修改原文件。

示例:

  1. 查看替换结果,不修改原文件

    # 将 file.txt 中的 "hello" 替换为 "world" 并显示在屏幕上
    sed 's/hello/world/g' file.txt
  2. 直接在原文件上修改 (危险!) 要直接修改原文件,可以使用 -i (in-place) 选项。强烈建议在 -i 后面加一个备份后缀,以防万一。

    # 推荐:先创建一个 .bak 备份文件,然后进行替换
    sed -i.bak 's/hello/world/g' file.txt
    # 执行后,会生成 file.txt.bak 备份文件,file.txt 被直接修改。
    # 不推荐:直接修改,没有备份
    sed -i 's/hello/world/g' file.txt
  3. 替换时忽略大小写 使用 I 标志。

    sed -i 's/hello/World/gI' file.txt
    # 这会把 "hello", "Hello", "HELLO" 等都替换为 "World"
  4. 替换特定行中的内容 可以在 s 前面加上行号。

    # 只替换第 5 行的内容
    sed -i '5s/hello/World/g' file.txt

方法 2:vimnano - 交互式文本编辑器

如果你只想修改一个或几个文件,使用文本编辑器是最直观、最安全的方式。

使用 vim:

  1. 打开文件:vim filename.txt
  2. 进入普通模式 (按 Esc 键确保在此模式)。
  3. 输入替换命令:
    • 替换全文%s/old_text/new_text/g
      • 表示整个文件范围。
      • s 是 substitute。
      • 是分隔符。
      • g 是 global。
    • 替换当前行s/old_text/new_text/g
    • 替换从第10行到第20行10,20s/old_text/new_text/g
  4. 按回车执行。
  5. 输入 wq 并回车,保存并退出。

使用 nano:

  1. 打开文件:nano filename.txt
  2. Ctrl + \ 调出替换菜单。
  3. 输入要搜索的文本 old_text,回车。
  4. 输入要替换成的文本 new_text,回车。
  5. nano 会询问:
    • Replace this one occurrence? (替换这次匹配?) -> 按 Y
    • Replace all remaining occurrences? (替换所有剩余匹配?) -> 按 Y
  6. Ctrl + X 退出,根据提示保存文件。

在命令行中替换历史命令

当你输入了一个很长的命令,但发现其中有个单词写错了,可以使用 fc^ 快速修正并重新执行。

方法 1:使用 fc 命令

fc (fix command) 会打开你指定的历史命令,让你用编辑器修改后执行。

# 重新编辑并执行上一个命令
fc
# 重新编辑并执行倒数第3个命令
fc -3

方法 2:使用 ^ 字符 (最快)

这是 Bash 内置的快捷方式,非常高效。

语法: ^旧词^新词^

示例: 假设你错误地输入了 ls -l /var/log,但想看 /var/log/nginx 的内容。

# 错误命令
ls -l /var/log
# 使用 ^ 快速修正
^log^nginx^
# 系统会自动执行修正后的命令: ls -l /var/log/nginx

总结与推荐

场景 推荐命令 优点 缺点
批量重命名文件 rename 's/old/new/' * 功能强大,支持正则,一行搞定 语法需要学习,有两个不同版本
替换文件内容 sed -i.bak 's/old/new/g' file 非常适合脚本自动化,处理速度快 语法复杂,直接修改文件有风险
交互式修改文件 vim / nano 直观、安全,适合手动编辑 不适合自动化脚本
修正历史命令 ^old^new^ 极其快速,一行搞定 仅用于修正上一个命令

建议:

  • 重命名文件:花5分钟搞懂 rename 的 Perl 语法,它会让你事半功倍。
  • 替换文件内容sed 是你的主力工具,务必记住 -i.bak 的用法,养成好习惯。
  • 不确定时:先用 sed 不带 -i 的方式查看结果,确认无误后再加上 -i 进行修改。
分享:
扫描分享到社交APP
上一篇
下一篇