Encontre a linha dentro do padrão de correspondência de arquivos e faça uma substituição

1

Estou tentando simplificar minha vida aqui, mas estou preso. Eu tenho um arquivo contendo várias linhas. Cada linha tem um usuário e um número. Eu gostaria de saber um one-liner bash para procurar um usuário e alterar o número. Como isso poderia ser feito? Agradecemos antecipadamente.

Meus arquivos são estruturados assim:

crmopr 162756
tpiopr 102334
ddnope 210928

- RESOLVIDO -

Este one-liner faz os trabalhos.

sed -i '/MATCHING_STRING/s/MATCHING_NUMBER/NEW_NUMBER/1' file

MATCHING_STRING: a string para encontrar a linha que eu quero alterar o número

MATCHING_NUMBER: o número que será substituído

NEW_NUMBER: o novo número

/ 1: altere apenas a primeira correspondência de manutenção na linha (poderia ser / g também neste caso)

-i: torna as alterações permanentes

- EDITAR

A solução aceita que veio segundos depois que editei o OP também funcionou!

    
por Luis Garnica Guilarte 24.08.2015 / 09:39

2 respostas

2

Se o seu arquivo se parece com:

abcd 1234
djhd 6534
fytf 4544

Você pode executar um one-liner AWK como este

index=2;for i in 'cat filename'; do echo $i; done|awk -v OFS=" " -v \
INDEX=$index '$1 ~ /^abcd$/ {$2="1233"; print }' >> NewFile.txt

Isso corresponderá ao nome dddd e substituirá o 1234 por 1233 . Isso redirecionará o resultado de saída para o novo arquivo chamado NewFile.txt .

Portanto, o seu NewFile terá as entradas substituídas. Isso pode ser programado para percorrer todas as entradas do arquivo.

    
por 24.08.2015 / 10:18
1

awk simples (mas o sed é melhor neste caso)

awk '$1 ~ /^MatchingString$/ {$2 = NEW_NUMBER}1' YourFile > NewFile
  • limite para correspondência de padrões EXATOS (evite seleção falsa de sub-padrões)

para um mais genérico (usando o conteúdo variável bash)

awk -v "User=${UserWanted}" -v "Data=${WantedNumber}" '$1 == User { $2 = Data} 1' YourFile > NewFile
    
por 04.09.2015 / 08:58

Tags