Une linhas arbitrárias para gerar uma linha

3

Eu quero unir a terceira e a quinta linha de um arquivo à saída de um script sem seguir novas linhas.

É possível implementar essa construção usando o código:

{
 echo 'Some text'
 echo 'Some text'
 echo -n 'Some text'
 cat text
 cat text
 echo -n 'Some text'
 echo 'Some text'
} > file

onde eu só preciso adicionar alguma opção depois do gato?

Suponha que a 3ª e 5ª linhas do arquivo text sejam 3 e 5. Após o processamento, ele deve ter a seguinte forma:

 Some text 
 Some text
 Some text35Some text
 Some text

Se bem entendi, a implementação por comandos sed é terrível no meu caso.

    
por John Taylor 26.05.2016 / 22:56

1 resposta

2

Usando sed

Pelo que entendi, você tem um arquivo text que é algo como:

$ cat text
1
2
3
4
5

E você deseja extrair as linhas 3 e 5 e colocá-las no meio de algumas instruções echo . Nesse caso, tente:

$ {  echo 'Some text';  echo 'Some text';  echo -n 'Some text';  echo -n "$(sed -n 3p text)$(sed -n 5p text)";  echo 'Some text';  echo 'Some text'; } >file
$ cat file
Some text
Some text
Some text35Some text
Some text

Simplificação

O acima pode ser realizado com um único comando echo :

$ echo $'Some text\nSome text\nSome text'"$(sed -n 3p text)$(sed -n 5p text)"$'Some text\nSome text' >file
$ cat file
Some text
Some text
Some text35Some text
Some text

Ou como um único comando printf :

$ printf 'Some text\nSome text\nSome text%s%sSome text\nSome text\n' "$(sed -n 3p text)" "$(sed -n 5p text)" >file
$ cat file
Some text
Some text
Some text35Some text
Some text

Como o comando sed funciona

O acima usa comandos sed como:

sed -n 3p text

Aqui, -n é uma opção que informa ao sed não imprimir nada a menos que explicitamente o solicitemos. 3p é um comando que diz ao sed para imprimir a terceira linha. Da mesma forma, usamos 5p se quisermos imprimir a quinta linha.

Usando o awk

Uma solução awk (dica de chapéu: Runium):

awk '
    BEGIN{
        printf "%s","Some text\nSome text\nSome text"
    }
    NR>5 {exit}
    NR==3 || NR==5 {printf "%s", $0}
    END{
        printf "%s","Some text\nSome text\n"
    }' text
    
por 26.05.2016 / 23:28