Substitua o padrão um certo número de vezes por linha, usando sed

3

Estou tentando descobrir como substituir um padrão um determinado número de vezes usando sed .

Descobri que sed com g sinalizador substitui todas as ocorrências, sem o tempo 1, com o número especificado substituindo essa ocorrência, g3 maior / igual 3.

Mas como substituir o padrão de alguma seção ou menor que algum número?

por exemplo. entrada, única linha contém o número do cartão e eu quero hash parte dele

1234 1234 1234 1234  
1234 1234 1234 1234
1234 1234 1234 1234
1234 1234 1234 1234 

Comandos:

$ sed "s/[0-9]\{4\}/\*\*\*\*/g"
**** **** **** ****
$ sed "s/[0-9]\{4\}/\*\*\*\*/g3"
1234 1234 **** ****
$ sed "s/[0-9]\{4\}/\*\*\*\*/2"
**** 1234 **** ****

Estou procurando uma maneira de substituir com a ocorrência específica de hash do padrão, por exemplo 1-3 ou & lt; 3. Para mais ocorrência de padrão em cada linha pode ser 5-10 ou outra coisa

    
por tomasz orłowski 03.08.2017 / 11:57

1 resposta

4

GNU sed , Sim, tem essa opção para substituir todas as g ocorrências de um patten ou da Xth ocorrência para todas depois de gX , mas você pode usar essas duas extensões para obter apenas o que deseja substituir primeiro Y ocorrências como abaixo para substituir as primeiras 3 ocorrências de PATTERN.

sed -E 's/PATTERN/TEMP-REPLACE/g4; s/PATTERN/REPLACE/g; s/TEMP-REPLACE/PATYERN/g' infile.txt

Também como solução não-GNU, você pode ter Y sed parts para substituir Y vezes de um PATTERN como abaixo,

sed -E -e 's/PATTERN/REPLACE/' -e 's/PATTERN/REPLACE/' -e 's/PATTERN/REPLACE/'

Resposta atualizada como pergunta revisada

Você pode usar awk com a definição de dois sinalizadores de controle para START e END e faça o seguinte:

awk -v START=1 -v END=5 '{for (i=START;i<=END;i++) gsub(/PATTERN/,"****",$i)}1' infile.txt 

por favor note que por padrão awk considerando ler arquivos delimitados por aba ou espaço , se a sua for diferente ou quiser informar o awk é por exemplo , , você pode definir com sua opção -F',' .

    
por αғsнιη 03.08.2017 / 13:43