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

