Sua expressão regular é uma mistura entre expressão regular básica e estendida.
Como uma expressão regular estendida (usando {13}
e \|
como um canal literal):
sed -E 's/\|37[0-9]{13}\|/|37xxxxxxxxxxxxx|/g'
Como alternativa, como uma expressão regular básica (usando \{13\}
e |
como um canal literal):
sed 's/|37[0-9]\{13\}|/|37xxxxxxxxxxxxx|/g'
Isso transforma sua string de exemplo em
dlkfhfd|fedfe|dfwe3f347fde|3745978|dlkfhr**|37xxxxxxxxxxxxx|**fedfe|dfwe3f347fde
Observe também que não há necessidade de escapar do |
na parte de substituição da expressão, já que essa parte nunca é interpretada como uma expressão regular.
Em awk
:
awk -F '|' -vOFS='|' '
{
for (i=1; i<=NF; ++i))
if (length($i)==15 && match($i,"^37[0-9]"))
$i="37xxxxxxxxxxxxx"
print
}'
Alguém poderia ter usado gsub()
aqui, mas isso teria tornado mais ou menos idêntico à solução sed
e, portanto, chato.
Isso tem o benefício de que a substituição também ocorra no primeiro ou no último campo, mesmo que esse campo não tenha sido delimitado por |
em ambas as extremidades.