Modificações de linha por linha no Unix

3

Estou procurando uma maneira de fazer o seguinte com um arquivo delimitado por pipe no UNIX, para EACH LINE e não sei por onde começar:

  1. Procure um caractere em uma linha de texto (assuma usando GREP?)
  2. Se encontrado, adicione algum texto no final dessa linha (usando o SED?)
  3. Se não encontrado, procure outro caractere na mesma linha
  4. Se encontrado adicione o texto no final da linha mais nada fazer
  5. LOOP PARA TODAS AS LINHAS DO ARQUIVO

Qualquer ponteiro seria apreciado.

    
por robablob 22.05.2017 / 15:49

2 respostas

5

Isso é tudo sed work, você não precisa de ferramentas extras:

Digamos que você queira adicionar foo no final da linha contendo f e bar no final das linhas sem f , mas com b

sed '/f/{
  s/$/foo/
  b
  }
/b/s/$/bar/'

Você pode "endereçar" linhas com /pattern/ , então os seguintes comandos são executados somente se contiverem o padrão. Portanto, no exemplo, apenas as linhas que contêm f acionam a execução da substituição s e b (o grupo {} os comandos, portanto, tudo dentro é aplicado apenas se o endereço corresponder. O b de ramificações no final do script para evitar acrescentar outra sequência a um b correspondente.

Diferentes abordagens sem ramificação:

sed '/f/s/$/foo/;s/^[^f]*b[^f]*$/&bar/'

Como exercício, você mesmo pode descobrir isso com algum conhecimento de sed , usando man sed se necessário.

    
por 22.05.2017 / 15:57
2

Se você quiser adicionar a mesma string de texto no final da linha para ambos cenários (chars para procurar: 'X' 'Y') então você pode fazer da seguinte forma:

sed -e 's/[XY].*/&__ADDEDTEXT__/' yourfile

Por outro lado, se você quisesse textos separados colocados no final das linhas, dependendo do caractere, então você pode fazer:

sed -e '
   /X/s/$/__TEXT1__/; t
   /Y/s/$/__TEXT2__/
' yourfile

Onde fazemos uso do comando t (read as test) para detectar se o comando anteriors/// foi bem-sucedido e pular para o final do código sed na linha atual. Além disso, observe a sintaxe: / regex / s /// = > se uma linha compreende o regex, execute a substituição na linha.

    
por 22.05.2017 / 16:25

Tags