Linux: Tentando Out sed

O exemplo a seguir Linux usando sed inclui linhas de amostra de um banco de dados empregado delimitado por dois pontos que tem cinco campos: número único de identificação, nome, departamento, número de telefone e endereço.

1218: Kris Cottrell: Marketing: 219.555.5555: 123 Main Street1219: Nate Eichhorn: Vendas: 219.555.5555: 1219 Locust Avenue1220: Joe Gunn: Contas a pagar: 317.555.5555: 21974 Unix Way1221: Anne Heltzel: Finanças: 219.555.5555: 652 Linux Road1222: John Kuzmic: Recursos Humanos: 219.555.5555: 984 Bash pista

Esta base de dados já existe desde o início da empresa e tem crescido para incluir todos os que agora trabalha, ou já tenha trabalhado, para a empresa. Um número de scripts proprietários ler a partir do banco de dados, e a empresa não pode dar ao luxo de ficar sem ele. O problema é que a empresa de telefonia mudou o prefixo 219 a 260, então todas as entradas no banco de dados precisa ser mudado.

Esta é precisamente a tarefa para a qual sed foi criado. Em oposição ao padrão editores (interactivo), uma editor de fluxo trabalha o seu caminho através de um arquivo e faz mudanças com base nas regras que lhe são atribuídos. A regra neste caso é mudar 219 para 260. Não é assim tão simples, no entanto, porque se você usar o comando

sed 's / 219/260 /'

o resultado não é totalmente o que você quer (alterações estão em negrito):

1218: Kris Cottrell: Marketing:260.555.5555: 123 Main Street1260: Nate Eichhorn: Vendas: 219.555.5555: 1219 Locust Avenue1220: Joe Gunn: Contas a pagar: 317.555.5555:26074 Unix Way1221: Anne Heltzel: Finanças:260.555.5555: 652 Linux Road1222: John Kuzmic: Recursos Humanos:260.555.5555: 984 Bash pista

As mudanças nos primeiro, quarto e quinto linhas estão corretas. Mas na segunda linha, a primeira ocorrência de 219 aparece no número de identificação do empregado, em vez de o número de telefone e foi alterado para 260. Se você quiser mudar mais do que a primeira ocorrência em uma linha, você pode golpear um g (para global) Para o comando:

sed 's / 219/260 / g'

Isso é não o que você quer fazer neste caso, no entanto, porque o número de identificação do funcionário não deve mudar. Da mesma forma, na terceira linha, uma alteração foi feita para o endereço, pois contém o valor que está sendo pesquisado for- nenhuma mudança deveria ter sido feita porque o empregado não tem o prefixo 219 telefone.

A primeira regra de usar sed é identificar o que torna o local da corda que você está procurando único. Se o prefixo de telefone foram encerradas em parênteses, seria muito mais fácil de isolar. Neste banco de dados, no entanto, que não é o caso-a tarefa se torna um pouco mais complicado.

Se você disse que o prefixo de telefone deve aparecer no início do campo (denotado por dois pontos), o resultado seria muito mais perto do que você quer:

sed 's /: 219 /: 260 /'

Mais uma vez, o negrito foi adicionado para mostrar as alterações:

1218: Kris Cottrell: Marketing:260.555.5555: 123 Main Street1219: Nate Eichhorn: Vendas:260.555.5555: 1219 Locust Avenue1220: Joe Gunn: Contas a pagar: 317.555.5555:26074 Unix Way1221: Anne Heltzel: Finanças:260.555.5555: 652 Linux Road1222: John Kuzmic: Recursos Humanos:260.555.5555: 984 Bash pista

A precisão tem aumentado, mas existe ainda o problema da terceira linha. Porque o cólon ajudou a identificar o início da cadeia, pode ser tentador para voltar-se para o período para identificar o fim:

sed 's /: 219 ./: 260./'

Mas o resultado ainda não é o que se esperava (note a terceira linha):

1218: Kris Cottrell: Marketing:260.555.5555: 123 Main Street1219: Nate Eichhorn: Vendas:260.555.5555: 1219 Locust Avenue1220: Joe Gunn: Contas a pagar: 317.555.5555:260.4 Unix Way1221: Anne Heltzel: Finanças:260.555.5555: 652 Linux Road1222: John Kuzmic: Recursos Humanos:260.555.5555: 984 Bash pista

Como o período tem um significado especial qualquer caractere, for encontrada uma correspondência se o 219 é seguido por um período, a 7, ou qualquer outro caractere único. Seja qual for o personagem, ele é substituído por um ponto. O lado substituição de coisas não é o problema- a busca precisa ser mexido.

Ao usar o caractere , podemos substituir o significado especial do período e especifique que você está realmente procurando por um período e não a um único caractere:

sed 's /: 219 ./: 260./'

O resultado torna-se:

1218: Kris Cottrell: Marketing:260.555.5555: 123 Main Street1219: Nate Eichhorn: Vendas:260.555.5555: 1219 Locust Avenue1220: Joe Gunn: Contas a pagar: 317.555.5555: 21974 Unix Way1221: Anne Heltzel: Finanças:260.555.5555: 652 Linux Road1222: John Kuzmic: Recursos Humanos:260.555.5555: 984 Bash pista

E a missão está cumprida.

menu