如何使用sed命令:当第21位为R时替换第13-14位MP为GH?
用sed实现固定位置的条件替换
当然可以实现!针对这种固定长度记录的条件替换需求,sed完全能胜任,下面是具体的命令和详细解释:
核心命令
sed -E '/^.{20}R/ s/^(.{12})MP/\1GH/' input.txt
命令拆解
我们把这个命令分成两部分来看:
地址匹配(筛选目标行):
/^.{20}R/^匹配行的开头.{20}匹配任意20个字符(对应记录的前20位)- 紧接着的
R表示第21位字符必须是R,只有满足这个条件的行才会被后续的替换操作处理
替换操作:
s/^(.{12})MP/\1GH/^(.{12})捕获记录的前12位字符,用\1在替换结果中引用这部分内容MP匹配第13-14位的目标子串\1GH将捕获的前12位保留,把MP替换成GH,后续的所有字符都会自动保留
效果示例
假设你的输入文件中有这样两行:
UNIT56712423MP000000R0990 UNIT56712423MP000000X0990
执行命令后,第一行(第21位是R)会被修改为:
UNIT56712423GH000000R0990
第二行(第21位不是R)则保持不变。
额外说明
- 如果你的sed版本是GNU sed,也可以用
-r代替-E,两者作用相同(启用扩展正则表达式,避免对括号和量词转义) - 如果需要直接修改原文件而不是输出到终端,GNU sed可以加
-i选项,BSD sed(比如macOS上的)需要用-i '':# GNU sed sed -i -E '/^.{20}R/ s/^(.{12})MP/\1GH/' input.txt # BSD sed(macOS) sed -i '' -E '/^.{20}R/ s/^(.{12})MP/\1GH/' input.txt
内容的提问来源于stack exchange,提问作者user8855619
相关产品推荐
相关产品推荐

