substituição de padrão usando sed [closed]

0

Alguém pode sugerir como resolver isso? Suponha que eu tenha um arquivo e queira substituir a primeira ocorrência de um padrão na linha correspondente por algum valor dinâmico. O padrão aqui é as .

arquivo de origem:

a b c as aa as
as b d f aa sa
df as kf as df

arquivo de destino:

a b c 1 aa as
2 b d f aa sa
df 3 kf as df
    
por Ashish Sahoo 25.01.2017 / 21:52

4 respostas

3

Como o padrão de substituição muda toda vez, isso pode ser mais uma coisa de awk:

awk 'BEGIN { needle=1 } /as/ { $0=gensub( /as/, needle, 1, $0 ); needle=needle+1} { print } ' /path/to/input

Os itens acima funcionam com GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.4, GNU MP 6.1.0)

    
por 25.01.2017 / 22:08
3

Se você realmente quiser usar sed, isso pode ser feito de forma agradável em um loop while:

count=1;
while read line
    do sed 's/as/'"$count"'/1' <<< "$line";
    count=$((count+1));
done < source_file >> target_file

O par '' de "$count" é necessário para que o shell faça a expansão adequada da variável para uso dentro do comando sed.

Ainda mais curto (graças a Kusalananda) :

while read line
    do sed 's/as/'"$(( ++count ))"'/1' <<< "$line";
done < source_file > target_file

Se você quiser incrementar somente se o padrão for encontrado:

count=1;
while read line;
    do sed '/as/! {q100}; s/as/'"$count"'/1' <<< "$line";
    [[ "$?" -eq 0 ]] && (( ++count ));
done < source_file > target_file
    
por 25.01.2017 / 22:26
1

com perl

$ perl -pe 'BEGIN{$n=1} s/as/$n++/e' file
a b c 1 aa as
2 b d f aa sa
df 3 kf as df
    
por 26.01.2017 / 00:08
0

Aqui está um pequeno script python que pode fazer o que você pede.

#!/usr/bin/env python
import sys
counter = 0
with open(sys.argv[1]) as fd:
    for line in fd:
        new_words = []
        words = line.strip().split()
        found = False
        for word in words:
            val = word
            if word == 'as' and not found:
                counter += 1
                found = True
                val = str(counter)
            new_words.append(val)

        print(" ".join(new_words))

E uma execução de teste:

$ ./substitute_dynamic_val.py input.txt                                                                                  
a b c 1 aa as
2 b d f aa sa
df 3 kf as df
    
por 25.01.2017 / 22:54

Tags