Usando o comando sed para encontrar a primeira ocorrência do padrão e anexar

2

Digamos que haja um arquivo de texto como abaixo:

Hello world
types=""
Mario
types="Game"

Tudo o que quero fazer é encontrar a primeira ocorrência de type="" e acrescentar com a palavra program

Minha saída desejada:

Hello world
types="program"
Mario
types="Game"

Eu preciso usar no shell script do Unix.

O que eu tentei:

sed -i  '1,/types=\"\"/s/types=\"\"/types=\"program\"/' filename

Este comando apenas insere e não anexa. Tentei adicionar a\ mas ainda não está funcionando.

    
por VRVigneshwara 09.06.2015 / 10:03

3 respostas

2

POSIXly:

$ sed -e '1,/types=""/{
  //s/"/&program/
}
' file

É estranho que acima de falhar no GNU sed, você precisa:

$ sed -e '1,/types=""/{
  /types=""/s/"/&program/
}
' file

Todos acima falharão se types="" aparecer na primeira linha. Nesse caso, você pode usar o GNU sed ou o BSD sed 0,/pattern/ :

$ sed -e '0,/types=""/{                
  /types=""/s/"/&program/
}
' file

ou POSIX um:

$ sed -e '/types=""/{
  s/"/&program/
  :1
  n
  b1
}
' file

ou veja a resposta do @ mikeserv .

    
por 09.06.2015 / 10:13
3
{   sed '/types=""/!b
        s/"/&program/;q'
    cat
}   <infile >outfile

Um POSIX sed deixará seu deslocamento do arquivo de entrada exatamente onde q uits de entrada. Com o GNU sed , você pode precisar da opção -u .

    
por 09.06.2015 / 10:54
3

Você pode usar i para inserir, depois d para excluir a linha e q para sair:

~$ sed '/types=""/{i\
> types="program"
> d;q}' f
Hello world
types="program"
Mario
types="Game"

O seguinte não funciona (obrigado @mikeserv): ou simplesmente c para alterar a linha e q para sair:

~$ sed '/types=""/{c\
> types="program"
> q}' f
Hello world
types="program"
Mario
types="Game"

(e, claro, manter o -i no lugar)

    
por 09.06.2015 / 10:11