Quiero reemplazar los primeros seis , para cada línea en un archivo de texto usando sed o algo similar en Linux.
Hay más de seis , en cada línea, pero solo los primeros seis deben reemplazarse por | .
Sed realmente no admite la noción de "las primeras n ocurrencias", solo "la n -ésima ocurrencia"; GNU sed tiene uno para "reemplazar todas las coincidencias desde el n -ésimo en adelante", que no es lo que desea en este caso. Para reemplazar las primeras seis comas, debe llamar al comando s seis veces:
sed 's/,/|/;s/,/|/;s/,/|/;s/,/|/;s/,/|/;s/,/|/' infile Sin embargo, si sabe que no hay | en el archivo y tiene GNU sed, puede hacer esto:
sed 's/,/|/g;s/|/,/7g' infileEsto reemplaza todas las comas con tubos, luego convierte los tubos del 7 en adelante a comas.
Si tiene tuberías de antemano, puede convertirlas en algo que sepa que no está en la cadena primero:
sed 's/|/~~/g;s/,/|/g;s/|/,/7g;s/~~/|/g' infile Esto hace que todo | en ~~ primero, luego todo , en | , entonces el | del 7 en adelante de nuevo a , y finalmente el ~~ de nuevo a | .
Probando en este archivo de entrada:
,,,,,,X,,,,,, ,,,|,,,|,,,|,,,|el primer y tercer comando dan como resultado
||||||X,,,,,, ||||||||,,,|,,,|El segundo fallaría en la segunda línea porque ya hay caracteres de canalización.
Esto podría funcionar para usted (GNU sed):
sed 'y/,/\n/;s/\n/,/7g;y/\n/|/' file Traduzca todos los , a \n , luego reemplace desde el séptimo \n hasta el final de la línea por , , luego reemplace los \n restantes por | 's.
Use el siguiente patrón en sed: sed 's/old/new/<number>'
Donde <number> es el número de veces que desea que se aplique este patrón.
Puede reemplazar <number> con g para aplicar el patrón a todas las ocurrencias.