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

awk中gsub未替换字段内所有句点的问题及解决需求

解析nmcli输出生成环境变量的字符替换问题

问题场景

需要解析nmcli的输出内容,生成可用于declare命令的环境变量定义,但现有awk命令无法完成预期的字符替换,且会截断部分值内容。

输入生成命令

etherNIC=$(nmcli --get-values NAME connection show)
nmcli connection show $etherNIC | grep -i  "ipv4.gateway\|ipv4.route" > ./ipv4settings.txt

输入文件内容

cat ./ipv4settings.txt
ipv4.gateway:                           192.168.2.1
ipv4.routes:                            --
ipv4.route-metric:                      -1
ipv4.route-table:                       0 (unspec)

当前awk命令及输出

cat ./ipv4settings.txt | awk '{ split($0, array, ":") ; gsub( "\\.", "_", $1 ) ;  gsub( ":" , "=" , $1 ) ; print $1$2 }'

输出:

ipv4_gateway=192.168.2.1
ipv4_routes=--
ipv4_route-metric=-1
ipv4_route-table=0

期望输出

ipv4_gateway=192.168.2.1
ipv4_routes=--
ipv4_route_metric=-1
ipv4_route_table=0 (unspec)

解决方案

问题根源有两个:

  1. 原命令仅替换了.,未处理属性名中的-;
  2. 使用$1和$2会截断包含空格的取值内容(如0 (unspec))。

改用指定分隔符的方式处理,同时替换所有需要转换的字符:

awk -F': ' '{name=$1; gsub(/[.-]/, "_", name); print name "=" $2}' ./ipv4settings.txt

命令说明

  • -F': ':将每行按:加空格的组合作为分隔符,把行内容拆分为属性名和取值两部分,确保取值部分完整保留所有内容;
  • gsub(/[.-]/, "_", name):将属性名中的.和-统一替换为_;
  • print name "=" $2:拼接成环境变量定义格式的字符串。

执行该命令后,输出完全符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:58:12