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
相关产品推荐
相关产品推荐

