You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 18.04下使用Shell脚本向文本指定位置插入固定缩进内容的实现方法

指定位置插入固定缩进配置的Shell实现方案

核心实现逻辑

  • 不硬编码行号,通过匹配目标行的特征(2个空格开头的</schema>行)定位插入点,避免文件内容变动导致插入位置偏移
  • 预设完全符合缩进要求的插入内容,通过逐行输出的方式保证格式不被破坏
  • 修改前自动备份原文件,兜底操作失误导致的配置损坏
  • 插入完成后执行schema编译操作,让配置生效

可直接运行的脚本内容

#!/bin/bash
TARGET_FILE="/usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml"

# 备份原配置文件
sudo cp -a "$TARGET_FILE" "${TARGET_FILE}.bak"

# 逐行处理文件,插入匹配格式的内容
sudo awk '
BEGIN {
    # 严格按缩进要求定义插入内容
    insert_content[1] = ""
    insert_content[2] = "    <key name=\x27enabled\x27 type=\x27b\x27>"
    insert_content[3] = "      <summary>Enable remote access to the desktop</summary>"
    insert_content[4] = "      <description>"
    insert_content[5] = "        If true, allows remote access to the desktop via the RFB"
    insert_content[6] = "        protocol. Users on remote machines may then connect to the"
    insert_content[7] = "        desktop using a VNC viewer."
    insert_content[8] = "      </description>"
    insert_content[9] = "      <default>false</default>"
    insert_content[10] = "    </key>"
    insert_content[11] = ""
}
# 匹配到目标插入行(两个空格开头的</schema>)时,先输出预设的插入内容
/^  <\/schema>$/ {
    for (line in insert_content) {
        print insert_content[line]
    }
}
# 原文件所有行按原样输出
{
    print $0
}
' "$TARGET_FILE" > "${TARGET_FILE}.tmp"

# 替换原文件
sudo mv "${TARGET_FILE}.tmp" "$TARGET_FILE"

# 编译gsettings schema,让修改生效
sudo glib-compile-schemas /usr/share/glib-2.0/schemas/

关键注意事项

  • 脚本中所有插入内容的前导空格完全匹配要求:<key>行保留4个空格缩进,<summary>、<description>等子标签行保留6个空格缩进,嵌套的描述文本行保留8个空格缩进,不会出现格式错位
  • 因为目标文件属于系统全局配置目录,必须使用sudo权限执行脚本,否则会触发文件写入权限拒绝
  • 如果需要修改插入的内容,直接调整awk脚本里BEGIN块定义的insert_content数组即可,不需要改动其他逻辑
  • 备份的文件会存放在同目录下的.bak后缀路径,出现问题时直接将其内容覆盖回原文件即可快速恢复

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 15:45:04