Substituir uma palavra com base nos primeiros n caracteres

0

Eu tenho um arquivo com dados como o seguinte:

ab001

ab002

ab003

ab004

Eu tenho que substituir todas as palavras que começam com 'ab' para 'ab001', ou seja, após a alteração, o arquivo deve ser lido como

ab001

ab001

ab001

ab001

Eu tentei %s/ab*/ab001/g em VI editor, mas não está dando o resultado esperado. Eu tentei o Google também, mas não consegui encontrar nenhuma solução.

    
por Mistu4u 23.11.2016 / 17:05

4 respostas

3

Desde que você marcou isso com e originalmente perguntado sobre vi, eu explicarei porque não funcionou no vi para você e como consertá-lo. Você disse que tentou originalmente:

%s/ab*/ab001/g

A maneira como o * funciona nas pesquisas é comparando o átomo anterior 0 ou mais vezes, o maior número possível. De :h /* :

                            */star* */\star*
*   (use \* when 'magic' is not set)
    Matches 0 or more of the preceding atom, as many as possible.

Nesse caso, o átomo anterior é 'b', portanto, essa pesquisa corresponderá a qualquer um deles:

a
ab
abbb
abbbbbbbbbbbbbbbbbbb

Ele também corresponderá a ab001 , mas corresponderá apenas à primeira parte, portanto, a correspondência será (ab)001 . Vi vê que você estava procurando por isso e o substitui por (ab001)001 . A solução é simples. Você quer combinar

'ab' followed by anything

O caractere de ponto ( . ) corresponderá a qualquer caractere, exceto por uma nova linha. Então, se você procurar por

/ab.*/

corresponderá a qualquer coisa que comece com 'ab'. Então você quer:

:%s/ab.*/ab001/g

Se isso corresponder muito (por exemplo, palavras como 'absolutamente'), você poderá simplificar isso para procurar apenas dígitos. Por exemplo, isso corresponderá a 'ab' seguido por qualquer número de dígitos:

/ab\d*/

e isso corresponderá a 'ab' seguido por exatamente três dígitos:

/ab\d\{3}/

Eu recomendaria marcar esta página para uma referência rápida do vi-regex. Descobri que é extremamente valioso para solucionar problemas de certas expressões regulares.

    
por 23.11.2016 / 21:55
0

Você pode fazer isso usando awk conforme abaixo:

cat input_file | awk '{if($1~/^ab/){print "ab001"}else{print $0}}'

O awk pesquisará se o primeiro campo do seu arquivo começar com "ab" e o substituirá por "ab001" usando o caractere ^ , o que significa que start of do campo selecionado, ou print o registro como é.

    
por 23.11.2016 / 17:23
0

Eu tentaria um perl oneliner

perl -i.bak -pe 's/\bab.*?\b/ab001/g;' [file(s)] 

A expressão regular localiza todos os elementos nos limites de palavras que começam com 'ab' e os substitui por 'ab001'

Eu criei este arquivo: ab001

ab002
ab003
ab004
ab005  ac001
ad0032 ab006

E esse script perl gerou essa saída:

ab001
ab001
ab001
ab001
ab001  ac001
ad0032 ab001

que é o que eu acho que você queria.

As outras opções que usei são melhor explicadas com a Documentação Perl no link perlrun - como executar o interpretador Perl

    
por 23.11.2016 / 17:27
0

Você já tentou

$ sed 's/ab\(.\+\)/ab001/g' -i file.txt

ou

$ sed 's/\(^ab\).*/ab001/g' -i file.txt

Uma maneira mais simples e melhor de fazer, eu acho espero que seja o que você está procurando.

    
por 23.11.2016 / 21:21

Tags