Como posso inserir o conteúdo de um arquivo em uma string no bash

2

Gostaria de acrescentar o conteúdo de um arquivo de texto de várias linhas depois de uma determinada linha em uma string. Por exemplo, se o arquivo file.txt contiver

line 1
line 2

Gostaria de fazer algo como printf "s1random stuff\ns2 more random stuff\ns1 final random stuff\n" | sed "/(^s2.+)/a $(<file.txt)"

Para obter o resultado:

s1 random stuff
s2 more random stuff
line 1
line 2
s1 final random stuff

Eu tentei várias combinações de citações e caracteres de escape, mas nada parece funcionar. No meu caso de uso particular, a string será uma variável bash, então se houver alguma coisa esotérica que torna isso mais fácil, seria bom saber.

O que eu tenho agora que funciona é escrever a string em um arquivo, usando o grep para encontrar a linha que eu gostaria de acrescentar depois e usando uma combinação de head, printf e tail para juntar o arquivo . Parece que eu não deveria ter que escrever o texto em um arquivo para fazer isso funcionar.

    
por William Everett 20.01.2015 / 21:39

3 respostas

4

Note que você não precisa ler o arquivo antes, o sed tem o% Comandor que pode ler um arquivo:

$ printf -v var "%s\n" "s1random stuff" "s2 more random stuff" "s1 final random stuff"

$ echo "$var"
s1random stuff
s2 more random stuff
s1 final random stuff

$ sed '/^s2/r file.txt' <<< "$var"
s1random stuff
s2 more random stuff
line 1
line 2
s1 final random stuff
    
por 20.01.2015 / 22:46
1

Você precisa substituir as novas linhas na variável com \newline . E o texto a ser inserido precisa ser precedido por \newline .

var=$(<file.txt)
# Put backslash before newlines in $var
var=${var//
/\
}
printf "s1random stuff\ns2 more random stuff\ns1 final random stuff\n" | sed "/^s2/a \
$var"
    
por 20.01.2015 / 21:54
0

Você está tentando fazer algo assim?:

LINE1='cat test.file | sed '1!d''
LINE2='cat test.file | sed '2!d''
LINE3='cat test.file | sed '3!d''
LINE4='cat test.file | sed '4!d''

echo $LINE1
echo $LINE2
    
por 20.01.2015 / 21:48