Fórum Ubuntu Linux - PT
Suporte Técnico => Programação e Scripts => Tópico iniciado por: macapella em 14 de Maio de 2022, 11:46
-
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
-
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' << (https://www.linuxmint.com.br/discussion/35081/pequeno-how-to-sobre-como-mudar-a-sua-sources-list-com-o-sed)
Onde basicamente te mostra que deveria ter um s' por exemplo:
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+
-
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) (https://en.wikipedia.org/wiki/Leaning_toothpick_syndrome).
-
É @Zekkerj...
...
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+
-
O 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.
-
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".