Dificuldade com o comando sed

Iniciado por macapella, 14 de Maio de 2022, 11:46

tópico anterior - próximo tópico

macapella

Ola.

Pessoal estou tentando fazer um script para editar o arquivo

".xscreensaver" e incluir uma linha, por exemplo:

            qix -root                \n\

como mostrado acima, com espaços etc, tentei com o comando abaixo

sudo sed -i '53c\            qix -root                \n\' ~/.xscreensaver

Mas não estou conseguido, fica faltando a ultima contra barra

como mostrado abaixo

            qix -root                \n

Alguem poderia ajudar?

Gente não tenho conhecimento e estou iniciando meus estudos em shell script linux, desculpe se o texto ficou

muito grande e desde ja, muito obrigado pela atenção

creto

#1
Olá,

Dê uma lida nisso que escrevi a alguns anos atrás, pode ser que te mostre o caminho, sem as pedras:

>> Pequeno how to sobre como mudar a sua sources.list com o 'sed' <<

Onde basicamente te mostra que deveria ter um s' por exemplo:
Citação de: macapella online 14 de Maio de 2022, 11:46
sudo sed -i s' <o_restante_do_seu_conteúdo_aqui>
...

Uso: sed [OPÇÃO]... {script-apenas-se-for-único} [arquivo-entrada]...

  -n, --quiet, --silent
                 suprime a impressão automática do buffer padrão
      --debug
                 anota a execução do programa
  -e script, --expression=script
                 adiciona o script aos comandos a serem executados
  -f arquivo-script, --file=arquivo-script
                 adiciona o conteúdo do arquivo-script aos comandos
                 a serem executados
  --follow-symlinks
                 segue links simbólicos ao editar o próprio arquivo original
  -i[SUFIXO], --in-place[=SUFIXO]
                 edita o arquivo original (faz backup se usado SUFIXO)
  -l N, --line-length=N
                 determina comprimento da quebra de linha para comando `l'
  --posix
                 desativa todas as extensões GNU.
  -E, -r, --regexp-extended
                 usa sintaxe moderna de expressões regulares, sem escapes.
                 (para portabilidade, use POSIX -E).
  -s, --separate
                 considera arquivos como entidades separadas, e não
                 como um longo e único fluxo de dados.
      --sandbox
                 opera em modo sandbox (desabilita comandos e/r/w).
  -u, --unbuffered
                 carrega uma quantidade mínima de dados dos arquivos de entrada
                 e descarrega os buffers de saída com mais frequência
  -z, --null-data
                 separa linhas por caracteres NULOs
      --help     mostra esta ajuda e sai
      --version  mostra informações sobre a versão e sai

Se nenhuma opção -e, --expression, -f, ou --file é dada, o primeiro
argumento que não seja uma opção é considerado como o script sed a
ser interpretado. Todos os argumentos restantes são considerados
como nomes de arquivos de entrada. Caso nenhum arquivo de entrada
seja especificado, então a entrada padrão será lida.

Página do GNU sed: <https://www.gnu.org/software/sed/>.
Ajuda sobre softwares GNU: <https://www.gnu.org/gethelp/>.
Envie relatórios de erros para: <bug-sed@gnu.org>.


Espero que lhe seja útil de alguma forma.

T+
A vida, é feito andar de bicicleta, se parar, você cai! (Gabriel Contino)
Blog do Paulo Corrêa Creto

zekkerj

#2
Estranho que tenha funcionado [mesmo errado] da forma como você colocou, @macapella. No meu entendimento, era pra ter dado erro.

Normamente o caracter da contra-barra (" \ ") indica que o próximo caracter não tem o significado normal. Isso deveria ter feito com que o apóstrofe que você colocou na sua linha, logo após a ele, não fosse identificado, deixando a string aberta.

Sem falsa modéstia, eu confesso que o sed é um dos poucos mistérios do Linux que está além do meu alcance.

sudo sed -i '53c\            qix -root                \n\' ~/.xscreensaver

Se nessa linha, no trecho  "... -i '53c\ ... \' ...", se o que vem depois do "53c" era pra ser uma expressão regular (RE), então se vc quer que o " \ " final seja considerado, não pode usar um " \ " no início, pois assim você está dizendo ao sed que esse par de " \ " está delimitando a RE. Se o problema for esse, mudar o delimitador da RE resolve:

sudo sed -i '53c/            qix -root                \n\/' ~/.xscreensaver

Pode ser também que, como eu disse antes, o " \ " final esteja sendo entendido como modificador do apóstrofe logo a seguir.
Nesse caso, vc teria que usar um segundo " \ ", para dizer ao shell (não ao sed --- complicado, né?...) que vc não quer que o " \ " tenha seu significado normal. Mas como sua linha já tem outras contra-barras, provavelmente teria que proteger todas elas, o que ficaria mais ou menos assim:

sudo sed -i '53c\\            qix -root                \\n\\' ~/.xscreensaver

Enfim... isso é o um caso claro de "Síndrome do Palito de Dente Inclinado" (Leaning Toothpick Sindrome ou LTS).
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

creto

É @Zekkerj...

Citação de: zekkerj online 18 de Maio de 2022, 12:41
...
Sem falsa modéstia, eu confesso que o sed é um dos poucos mistérios do Linux que está além do meu alcance.
...
O companheiro que parece que parecia fazer isso com os pés nas costas, não publica muito por aqui, não mais, mas deixou quase um livro para nós em suas 14.982 mensagens, saudades de ver/ler o fórum cheio dos dino's, atuante mesmo só poucos como você, platão vez ou outra e o galactus.

Desculpa o [Off]

T+
A vida, é feito andar de bicicleta, se parar, você cai! (Gabriel Contino)
Blog do Paulo Corrêa Creto

macapella

renato_pacheco (muito obrigado pela dica) do forum do Vivaolinux me deu uma dica que funcionou e resolveu meu problema

Ele escreveu:

Eu tentei assim e deu certo

sed -i '53c\            qix -root                \\n\\' ~/.xscreensaver

Muito obrigado a todos pela atenção.

Sampayu

Citação de: macapella online 23 de Maio de 2022, 12:46
Eu tentei assim e deu certo

sed -i '53c\            qix -root                \\n\\' ~/.xscreensaver

Vi que essas linhas do arquivo .xscreensaver iniciam com 4 tabulações, depois vem o texto, depois mais 4 tabulações seguidas por 1 a 4 espaços, e por fim o texto \n\.

O símbolo de tabulação é \t e o símbolo de espaço é \ seguido da quantidade desejada de espaços. Então, por exemplo, para acessar a linha 53 do arquivo e substituí-la por 4 tabulações + o texto qix -root + 4 tabulações + 4 espaços + o texto \n\, o comando fica assim:

sed -i '53c\\t\t\t\tqix -root\t\t\t\t\    \\n\\' .xscreensaver

Embora esse código seja mais "poluído", o resultado final dentro do arquivo .xscreensaver é mais "limpo".
Yuri Sucupira ("Sampayu")