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

如何用awk/sed/perl仅修改含RESOURCETAGMAPPINGLIST的行并保留其他行

问题描述

我有一个大文件,内容格式如下:

RESOURCETAGMAPPINGLIST  arn:aws:ec2:us-east-1:XXXXXX:instance/i-XXXXXXXXXXXXXXXXX
TAGS    app-name    appname1
RESOURCETAGMAPPINGLIST  arn:aws:ec2:us-east-1:XXXXXX:instance/i-XXXXXXXXXXXXXXXXX
TAGS    app-name    appname2
RESOURCETAGMAPPINGLIST  arn:aws:ec2:us-east-1:XXXXXX:instance/i-XXXXXXXXXXXXXXXXX
TAGS    app-name    appname1
..

希望仅修改包含RESOURCETAGMAPPINGLIST的行,其余行保持原样输出。修改后的匹配行需仅输出指定字段,示例如下:

arn ec2 us-east-1 XXXXXX
TAGS    app-name    appname1
arn ec2 us-east-1 XXXXXX
TAGS    app-name    appname2
arn ec2 us-east-1 XXXXXX
TAGS    app-name    appname1
..

我尝试过使用awk的gsub命令,但无法正确配置-F:参数,恳请提供解决方案,使用awk、sed或perl均可。

解决方案

使用awk实现

方法1:split分割字段

无需依赖gsub,直接通过split分割目标列提取内容:

awk '
/RESOURCETAGMAPPINGLIST/ {
    split($2, arr, ":")
    print arr[1], arr[3], arr[4], arr[5]
    next
}
1' input.txt
  • /RESOURCETAGMAPPINGLIST/ 匹配需要修改的行
  • split($2, arr, ":") 将第二列的ARN字符串按冒号分割为数组
  • 打印数组第1、3、4、5位元素,对应需求的arn、ec2、us-east-1、XXXXXX
  • next 跳过后续逻辑,直接处理下一行
  • 末尾的1表示对不匹配的行直接输出

方法2:指定多分隔符

通过-F同时设置空格和冒号为分隔符,直接提取对应字段:

awk -F'[ :]' '/RESOURCETAGMAPPINGLIST/ {print $2, $4, $5, $6; next} 1' input.txt
  • -F'[ :]' 表示以空格或冒号作为字段分隔符
  • 匹配行中$2是arn、$4是ec2、$5是us-east-1、$6是XXXXXX,直接打印即可

使用sed实现

利用正则分组捕获替换目标内容:

sed -E 's/RESOURCETAGMAPPINGLIST +arn:aws:([^:]+):([^:]+):([^:]+):.*/arn \1 \2 \3/' input.txt
  • -E 启用扩展正则表达式,简化分组写法
  • 正则匹配目标行,捕获ec2、us-east-1、XXXXXX三个部分
  • 将整行替换为arn加捕获的三个分组,用空格分隔
  • 不匹配的行会原样输出

使用perl实现

通过正则捕获完成替换,逻辑与sed类似:

perl -pe 's/RESOURCETAGMAPPINGLIST +arn:aws:([^:]+):([^:]+):([^:]+):.*/arn $1 $2 $3/' input.txt
  • -pe 逐行处理文件内容并输出结果
  • 正则表达式捕获目标字段后,替换为需求的格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:30:48