Como substituir a linha por 3 linhas / adicionar 2 antes de encontrado / adicionar 2 antes de 1 do final [fechado]

1

O arquivo é:

#Welcome to the file
#this is a file and it ends on "exit 0"
#Here are unknown number of lines
exit 0

Precisa ter essas linhas uma após a outra:

echo deadline > /sys/block/sda/queue/scheduler
echo 1 > /sys/block/sda/queue/iosched/fifo_batch

Então parece com isso:

#Welcome to the file
#this is a file and it ends on "exit 0"
#Here are unknown number of lines
echo deadline > /sys/block/sda/queue/scheduler
echo 1 > /sys/block/sda/queue/iosched/fifo_batch
exit 0

PROBLEMAS - comando dentro do comando dentro do comando com muitas linhas \n

Por enquanto eu tenho o comando sed -i 's/exit 0/echo deadline > /sys/block/sda/queue/scheduler\necho 1 > /sys/block/sda/queue/iosched/fifo_batch\nexit 0/gp' /usr/file , mas algo está errado - não funciona.

Atualização 1

"SLASHES" / to \/ : descobri que a solução para barras usa \/ e barras invertidas \ .

Então agora meu comando funciona sed -i 's/exit 0/echo deadline > \/sys\/block\/sda\/queue\/scheduler\necho 1 > \/sys\/block\/sda\/queue\/iosched\/fifo_batch\nexit 0/' /usr/file

Mas ele precisa ser modificado, porque agora ele encontra todas as expressões, mas como é que apenas encontra uma linha que não contém mais nada? Por isso, não substitui o que está em exit 0 no comentário de arquivos de exemplo.

Atualização 2

Pelo menos a linha que começa com ^ : encontrada para tornar a solução para este arquivo sed 's/^exit 0/\necho deadline > \/sys\/block\/sda\/queue\/scheduler\necho 1 > \/sys\/block\/sda\/queue\/iosched\/fifo_batch\nexit 0/' /usr/file , mas caso o arquivo de texto tenha linhas:

exit 0
exit 0 means exiting

Em seguida, não posso usar ^ para encontrar a linha que começa com a expressão.

Então, a melhor maneira seria que eu não encontrasse como encontrar a linha exata contendo apenas a expressão ou encontrar a linha de expressão e nem todas as expressões?

Atualização 3

Linha exata ^ & amp; $ : expulsa ^ não limita nada no lado esquerdo e $ nada está no lado direito então agora a solução de trabalho para 1. solução é sed -i 's/^exit 0$/\necho deadline > \/sys\/block\/sda\/queue\/scheduler\necho 1 > \/sys\/block\/sda\/queue\/iosched\/fifo_batch\nexit 0/' /usr/file

Eu quero aprender pelo menos 3 maneiras usando 1 comando de linha. Como:

  1. substitua a linha encontrada por 3 linhas com o comando contendo símbolo conforme mencionado
  2. encontrou linha completa e não apenas expressão e adicionou duas linhas antes de ser encontrada
  3. adicione 2 linhas 1 linha antes do fim
por Kangarooo 13.11.2011 / 06:21

2 respostas

4

Isso pode funcionar para você (todos eles conseguem a mesma coisa!):

 sed '/^exit 0/i\echo deadline > /sys/block/sda/queue/scheduler\necho 1 > /sys/block/sda/queue/iosched/fifo_batch' file

Pesquise a linha que começa com exit 0 e insira 2 linhas.

Ou:

 sed '$i\echo deadline > /sys/block/sda/queue/scheduler\necho 1 > /sys/block/sda/queue/iosched/fifo_batch' file

Insira 2 linhas antes da última linha do arquivo.

Ou:

 sed '$c\echo deadline > /sys/block/sda/queue/scheduler\necho 1 > /sys/block/sda/queue/iosched/fifo_batch\nexit 0' file

Altere a última linha do arquivo para 3 linhas.

    
por potong 22.01.2012 / 15:54
0

Para a pergunta 3: suponho que você queira adicionar algum texto entre a última e a última linha em um arquivo. Além disso, este texto consiste em 2 linhas, mas isso não importa. head -n -1 extrairá todos menos a última linha e tail -n 1 extrairá a última linha. Então pode-se fazer

head -n -1 file > outputfile
cat file_with_two_line_text >> outputfile
tail -n 1 file >> outputfile

Isso não é muito eficiente, pois ele verifica o arquivo duas vezes, enquanto é necessário digitalizá-lo apenas uma vez.

    
por Prateek 13.11.2011 / 10:42