Aqui tag ignorando novas linhas finais

1

Estou usando o sed para inserir algumas linhas acima de um padrão em um arquivo. Exemplo do arquivo

Stuff

Pattern

Stuff

Aqui está o código que estou usando para dividir o arquivo para inserir texto antes de Pattern

     patternline=$(grep -n "Pattern" "/my/file" | cut -f1 -d:)
     firstcut=$(($patternline -1))

     firstpart=$(sed -n 1,"$firstcut"p "/my/file")
     secondpart=$(sed -n ''"$abspathcomment"',$p' "/my/file")

     # Indentation intentional as snippet is nested within an IF statement
     text=$(cat <<EOF

Text I want to insert with one leading and two trailing new lines


EOF
)

     echo "$firstpart$text$secondpart" > "/my/file"

Estou dividindo o arquivo usando sed e inserindo o texto que desejo no meio e finalmente usando o cat para enviar o conteúdo para o mesmo arquivo.

Espero obter (algo semelhante a) a seguinte saída para o arquivo

Stuff

Text I want to insert with one leading and two trailing new lines


Pattern

Stuff

Mas, em vez disso, obtenho

Stuff

Text I want to insert with one leading and two trailing new linesPattern

Stuff

Não tenho certeza se sed ou bash estão removendo as novas linhas. Como posso mantê-los quando ecoando o resultado para um arquivo no bash?

    
por myol 23.02.2018 / 11:21

1 resposta

3

É a substituição de comandos que consome as novas linhas:

a=$( printf 'hello\nworld\n\n\n\n\n\n' )
printf 'a is "%s"\n' "$a"

Saída:

a is "hello
world"

Usando sed para resolver o problema original:

sed '/Pattern/i\
Text I want to insert with one leading and two trailing new lines\
\

' file

Ou com o GNU sed :

sed '/Pattern/i Text I want to insert with one leading and two trailing new lines\n\n' file

Aqui, usamos o comando i ("insert") em sed para inserir um determinado conjunto de linhas antes de qualquer linha correspondente a Pattern . Ao escapar das duas novas linhas (na primeira variação sed ), podemos inseri-las no texto. A nova linha principal no resultado é a mesma que estava precedendo Pattern desde o início.

Para os dados de exemplo, isso gera

Stuff

Text I want to insert with one leading and two trailing new lines


Pattern

Stuff

Isso tem o benefício de que nenhum dos espaços em branco existentes seja modificado.

    
por 23.02.2018 / 11:35

Tags