in reply to search and replace on a line by line basis

just change the "1, 8, 1" to "188, 8, 16" to match your case... those values are just for testing
#!perl -w # cases above the blank line should be replaced # successfully, below should not use strict; my ($len1, $len2, $len3) = (1, 8, 1); my $valid = qr/^.{$len1}(\d{$len2}).{$len3}$/; while (<DATA>) { next unless $_ =~ $valid; next unless $1 ne "00000000"; substr($_, $len1, $len2) = "20020101"; print; } __DATA__ X12345678X X14322678X X12534654X X12345678X X00000000X 12345678X X12345678 XX 12345678

perl -e'$_="nwdd\x7F^n\x7Flm{{llql0}qs\x14";s/./chr(ord$&^30)/ge;print'