AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-46470

Kes's questions

Martin Hope
Kes
Asked: 2023-09-13 18:06:00 +0800 CST

Como definir vários intervalos de páginas para pdftk com uma variável bash

  • 5

Estou usando Arch Linux, gerenciador de janelas Openbox e bash.
Tudo está atualizado com as versões mais recentes.

Alguém pode me dizer por que não consigo fazer com que a "$page_range"variável apareça pdftkquando especifico alguns intervalos de páginas como 3-5 7-9?

Quando especifico apenas um intervalo de páginas 3-5na minha caixa pop-up yad, tudo funciona como deveria.

pdftk permite que mais de um intervalo de páginas seja definido no comando. Na verdade, quando digito o comando na linha de comando sem usar variáveis ​​​​bash, o pdftk funciona conforme o esperado, considerando os intervalos de páginas 3-5 7-9. Só que não quando contenho esse valor dentro da variável "$page_range".

Tudo o que quero fazer é extrair os intervalos de páginas 3-5 e 7-9 do arquivo
/home/$USER/my_file.pdf
para outro arquivo pdf
usando a variável $page_rangepara definir meus intervalos.

Aqui está meu script simples.

#!/bin/bash

# collect the values with yad

extract_values=$(yad --form --width=200 \
--title="Enter the page ranges you wish to extract" \
--text="\n\n  Enter the page ranges you wish to extract\n    as eg 301-302\n    or 301-302 305-306\n     for grouping" \
--field="Page range":text "11-13 21-23" \
--button="Cancel!gtk-close":2 \
--button="Edit script":1 \
--button="Submit":0)



# strip out the values from the string
page_range=$(echo $extract_values | cut -d '|' -f  1)
echo $page_range



# produce a unique file extender 
page_range_slugify="$(echo "$page_range" | sed 's/ /_/g')" 
echo;echo $page_range_slugify
echo


# specify the filename
f=/home/$USER/my_file.pdf

# get path and file name without pdf extension
fz="${f%.*}"

# check everything is as it should be
yad --text="\n page range = $page_range\n page_range_slugify = $page_range_slugify\n file + path without file extension = $fz\n\n"

# below works only for one range but will not expand for two page ranges
pdftk "$f" cat "$page_range" output "$fz"_"$page_range_slugify".pdf

# below takes one range only as above 
#pdftk "$f" cat "$(printf %s "$page_range")" output "$fz"_"$page_range_slugify".pdf

# below takes both ranges when ranges are directly placed within the command
#pdftk "$f" cat 3-5 7-9 output "$fz"_"$page_range_slugify".pdf
 
bash
  • 2 respostas
  • 50 Views
Martin Hope
Kes
Asked: 2022-12-06 01:54:59 +0800 CST

script para trocar strings contendo novas linhas dentro do arquivo de texto (XML)

  • 5

Estou usando o Arch, que foi atualizado há algumas semanas. Os pacotes usados ​​são

  • Arch 6.0.10-arch2-1
  • BASH 5.1.16(1)-lançamento
  • gnu sed 4.9
  • gnu grep 3.8
  • openbox 3.6.1

Dentro do meu arquivo de texto Openbox, rc.xmltenho duas linhas da seguinte maneira

<!-- <keybind key="Right"> -->

<keybind key="s-Up">

Desejo alternar/trocar frequentemente as duas linhas acima pelas duas linhas abaixo usando um script

<!-- <keybind key="s-Up"> -->

<keybind key="Right">

Isso me permite alterar rapidamente uma combinação de teclas sem editar tediosamente meu arquivo de texto de configuração de combinações de teclas ( rc.xml) todas as vezes.

O script que tenho até agora está abaixo e não está funcionando, embora eu saiba que está próximo.

Não estou muito preocupado com a forma como essa alternância é alcançada, mas já tendo gasto uma quantidade significativa de tempo nisso, seria bom colocar o script abaixo funcionando.

As sedexpressões abaixo fazem o trabalho de troca de texto como deveriam.

A ifinstrução parece fazer a primeira sedtroca se a condição for atendida, mas não a segunda sedtroca se a condição não for atendida, que é o problema.

var_a=""

#var_a=$(grep -zoP  "<\!\-\- <keybind key=\"Right\"> \-\->\n\n<keybind key=\"s-Up\">" /home/kes/Dropbox/lubuntu-rc.xml | sed ':a;N;$!ba;s|\n\n||g')

var_a=$(grep -zoP  "<\!\-\- <keybind key=\"Right\"> \-\->\n\n<keybind key=\"s-Up\">" /home/kes/Dropbox/lubuntu-rc.xml | tr -d '\n' )

# result of grep is
# <!-- <keybind key="Right"> --><keybind key="s-Up">

echo $var_a; sleep 0.5

#if [[ -z ! "$var_a" ];then
if [[ '$var_a'=='<!-- <keybind key="Right"> --><keybind key="s-Up">' ]]; then

   sed -ie ':a;N;$!ba;s|<!-- <keybind key="Right"> -->\n\n<keybind key="s-Up">|<!-- <keybind key="s-Up"> -->\n\n<keybind key="Right">|g' /home/kes/Dropbox/lubuntu-rc.xml

else

   sed -ie ':a;N;$!ba;s|<!-- <keybind key="s-Up"> -->\n\n<keybind key="Right">|<!-- <keybind key="Right"> -->\n\n<keybind key="s-Up">|g' /home/kes/Dropbox/lubuntu-rc.xml

fi
text-processing
  • 2 respostas
  • 39 Views
Martin Hope
Kes
Asked: 2021-09-29 06:33:20 +0800 CST

Como usar blocos de código de repetição dentro de .bashrc

  • 0

Eu tenho 4 funções que são 100 linhas de código simples no meu .bashrc

Essas funções são idênticas, exceto pelo nome da função e as primeiras 3 linhas de código que são variáveis.

Como posso puxar as 97 linhas de código que são comuns para um bloco instanciado separado que eu chamo de cada uma das 4 funções?

Eu tentei fazer um bloco de função comum dessas 97 linhas comuns e chamá-lo de uma função muito pequena, mas não consegui fazer isso funcionar.

Aqui está a função com as 3 linhas únicas no topo e o código comum abaixo disso

function download_podcaster() 
   
######################################################################
##########                                                  ########## 
#   UNIQUE CODE FOLLOWS  #

#set-up the directory variables

dir_zz="/home/user/podcast_author"  
pone_dir="podcast_author"  
downloads_z="~/Downloads"  

##########   UNIQUE CODE ABOVE                              ##########
##########                                                  ########## 
######################################################################


#  vvvvv COMMON CODE BELOW   vvvvvv


   echo; echo "   .... this output is from youtube-dl ..."; echo

   #download the file
   youtube-dl -f 140 --restrict-filenames -o $dir_zz'/%(title)s.%(ext)s' $1


   #make dir if does not aleready exist
   mkdir -p $dir_zz

   #change to the downloads directory
   cd $dir_zz
   echo
   echo "current dir is:                                   "$(pwd)
   echo
  
   #open the downloads location to show the files with pcmanfm 
   #pcmanfm ~/Downloads &
   pcmanfm $dir_zz &> /dev/null
   
   file_name_z=$(youtube-dl --get-filename --restrict-filenames "$1")
   echo; echo "file name from provided by youtube-dl:            "$file_name_z; echo

   #grab the filename from youtube, and parse it into something useful
   #remove 11 digits before end of file name                
   file_name_z=$(echo $file_name_z | sed 's|...........\.mp4$|.mp4|g' | sed 's|...........\.m4a$|.m4a|g' \
       | sed 's|...........\.webm$|.webm|g' \
       | sed 's|,||g' | sed 's|!||g' | sed 's| |_|g'  |  \
       sed 's|-\.||g' | sed 's|webm||g' | sed 's|mp4||g' | sed 's|\?||g').m4a
           #  remove ,      remove !       replace " " with "_"
           #  remove "-."    remove "webm"
   echo; echo "file name after , ! \" \" ? removed:                "$file_name_z; echo

   var1=$(ls -t | grep -E "^[0-9]{3}" | sort | tail -n  1 | cut --bytes=1-3)
   echo; echo "\$var1 3 digit highest number from file set is:    "$var1; echo
   
   sleep .25
   #create the variable to assign the next file number to front of file name
   next_file_number=$(printf "%03d\n" $((10#$var1+5)))
   echo; echo "File number plus 5 is:                            "$next_file_number; echo

   sleep .25
   #new file name with three digit number in front of filename
   file_name_y=${next_file_number}_${file_name_z}
   echo; echo "concatenated filename is \$file_name_y:            ""$file_name_y"; echo


   #move the old file to the new file name
   mv "$file_name_z" "$file_name_y" 
   echo; echo "                                                  ""$file_name_y"; echo


   #plug phone in. Phone mount point in file system can be seen here
   #echo; cd /var/run/user/$UID/gvfs; ls; echo
   #reference
   #https://askubuntu.com/questions/342319/where-are-mtp-mounted-devices-located-in-the-filesystem
   #
   #How to get to the phone directory on the phone if the directory is dynamically allocated on the 
   #reference  
   #https://askubuntu.com/a/454697/624987
   #phone or changes, use this
   #cd /var/run/user/$UID/gvfs; cd * ; cd *; cd Music; mkdir -p $phone_dir; cd $phone_dir; ls
   #       
   #"cd *" changes to the first directory shown
   
   #grab the directory on the phone in which to place the file
   cd /var/run/user/$UID/gvfs; cd * ; cd *; cd Music; mkdir -p $phone_dir; cd $phone_dir
   phone_dir_long_path=$(pwd)


   echo "  ... now copying the file to the phone -->"; echo
   #copy file to phone
   cp $dir_zz/"$file_name_y" "$phone_dir_long_path"
   echo
   
   #open terminal at directory of files
   gnome-terminal --title="test" --command="bash -c '$phone_dir_long_path; ls; $SHELL'"

   echo
   #open the file name with the default app, usually vlc
   xdg-open $dir_zz/$file_name_y &

   echo
}
bash
  • 1 respostas
  • 48 Views
Martin Hope
Kes
Asked: 2020-03-07 04:12:31 +0800 CST

vim - como ... arrancar frase útil

  • 3

Estou usando a versão mais recente do vim 8.2.148 na versão mais recente do arch linux 5.5.6-arch1-1.

Se eu quiser copiar do cursor até uma letra mais adiante na frase, posso fazer isso, por exemplo nesta frase, se meu cursor estivesse no início da frase e eu quisesse puxar até o c de copiar eu faria dê o comando yuc, que copiaria "Se eu quiser".

Outro exemplo igualmente válido seria puxar do início da string para o início da segunda instância de "capturas de tela" nesta string:

/home/user/linux_config/script_yad/screenshots/change_screenshots_directory.sh

No entanto, se meu cursor estivesse no início desta frase e eu quisesse puxar até e incluindo a segunda instância da frase, como eu faria isso?

Eu acho que esse comando pode parecer estruturalmente algo como, yt2"sentence"embora esse comando não funcione.

Obviamente, usar a letra s para puxar não será satisfatório.

Desejo conseguir isso sem usar o modo visual.

Isso precisa de um plugin e, em caso afirmativo, qual?

Isso pode ser feito sem um plugin e como?

vim
  • 1 respostas
  • 653 Views
Martin Hope
Kes
Asked: 2019-01-27 05:52:25 +0800 CST

Terminar BASH For loop, que contém longa suspensão e outras coisas, usando qualquer chave específica

  • 4

Eu tenho um script bash que

  • tem um loop for que itera muitas vezes e dorme entre as iterações, potencialmente por um longo tempo. Isso então

  • grava os resultados em um arquivo e, em seguida, termina.

Ocasionalmente, recebo o resultado de que preciso antes que muitas iterações de loop sejam concluídas.

Nessas ocasiões, preciso que o script breaksaia do loop enquanto estiver

  • fazendo coisas, ou

  • adormecido

de forma que continue com o resto do script, após o loop for, que está gravando um arquivo de relatório de dados coletados até o momento.

Desejo usar uma combinação de teclas, por exemplo, CTRL+Q, para breaksair do loop for.

O script fica assim:

#!/bin/bash

for (( c=0; c<=$1; c++ ))
do  

# SOME STUFF HERE
#  data gathering into arrays and other commands here etc

# sleep potentially for a long time
sleep $2

done

#WRITE REPORT OUT TO SCREEN AND FILE HERE
bash shell-script
  • 3 respostas
  • 1554 Views
Martin Hope
Kes
Asked: 2019-01-16 04:54:55 +0800 CST

Posso criar uma função BASH que conterá o bloco de texto que pode ser chamado para saída para FILE e SCREEN para reduzir a repetição do bloco de código [duplicado]

  • 1
Essa pergunta já tem respostas aqui :
como produzir texto para tela e arquivo dentro de um script de shell? (4 respostas)
Fechado há 3 anos .

Eu tenho um utilitário BASH que gera medições para a tela ao vivo enquanto ele é executado e grava o resultado no arquivo ao mesmo tempo. Estou tendo que repetir o mesmo código duas vezes (veja abaixo).

Uma vez para escrever na tela, e

Uma vez para gravar no arquivo.

Isso me parece muita redundância.

Posso colocar um bloco de texto em algo como uma função e chamá-lo para ser gravado na tela e no arquivo ao mesmo tempo?

Isso reduziria um monte de re-keying.

Exemplo abaixo

###### write out to file : push end time at end ################
echo >> $file_name
echo "End time: "$end_time >> $file_name
echo >> $file_name
echo >> $file_name
echo >> $file_name

######  print to screen : push end time at end  #################

echo 
echo "End time: "$end_time 
echo
echo
echo

Então eu estaria procurando algo assim

funtion text_block{
######  print to screen : push end time at end  #################
echo 
echo "End time: "$end_time 
echo
echo
echo
}

Então um comando que faz algo assim

"commandimprimir text_blockna tela, imprimir text_blockno arquivo"

bash shell-script
  • 1 respostas
  • 198 Views
Martin Hope
Kes
Asked: 2019-01-15 05:25:32 +0800 CST

problema de lógica BASH; dificuldade em testar uma variável de string com IF e OR

  • 0

Eu tenho uma string var1que estou usando no BASH. Pode ser três valores

var1=on

var1=off

ou var1pode ser igual a qualquer coisa que não seja onouoff

Desejo construir uma instrução if em BASH que teste $var1seu conteúdo da seguinte maneira;

Se a $var1string for igual a " on" ou " off", saia da instrução if. se for $var1igual a qualquer outra coisa continue...

Eu tentei muitas possibilidades, incluindo -ne, !=, || e -o e estou em uma confusão completa.

Abaixo, colei o que estou usando, o que estou obtendo usando isso e o que quero.

var1=on

if [[ ${var1} != 'on' || $var1 != 'off' ]]; then echo var1 is NOT equal to \"on\" or \"off\". Var1 is equal to $var1 else echo var1 IS equal to \"on\". Var1 is equal to $var1 fi

Isso produz;

var1 is NOT equal to "on" or "off". Var1 is equal to on

O que eu quero é;

var1 IS equal to "on". Var1 is equal to on

bash shell-script
  • 1 respostas
  • 143 Views
Martin Hope
Kes
Asked: 2017-12-09 05:51:13 +0800 CST

Como criar código Bash dinamicamente com um loop e executá-lo à medida que é criado

  • 1

Eu tenho uma lista de linhas em um script Bash da seguinte forma

if [ ! -z "$clone01" ]; then git clone "$clone01"; fi
if [ ! -z "$clone02" ]; then git clone "$clone02"; fi
if [ ! -z "$clone03" ]; then git clone "$clone03"; fi
#      $clone01 .... through to ...  $clone60
if [ ! -z "$clone60" ]; then git clone "$clone60"; fi

o zero à esquerda no final da variável, quando o número é menor que 10, é importante.

Eu tentei várias substituições e loops, etc. Este código é muito repetitivo e tem 60 linhas.

Como posso criar este código dinamicamente e torná-lo parte do meu script executado? Qual é a abordagem ótima para esse problema?

bash variable-substitution
  • 3 respostas
  • 509 Views
Martin Hope
Kes
Asked: 2017-12-09 01:06:55 +0800 CST

Como posso alterar o nome de uma variável Bash em um loop e expandir o nome alterado?

  • 3

Estou tentando expandir as variáveis ​​Bash. Pesquisei, mas não tenho certeza de quais são os termos de pesquisa para o que estou tentando fazer. Aqui está o meu código. Duas questões:

  1. Como obtenho a saída desejada conforme mostrado?
  2. Qual é a terminologia Bash para descrever o que eu quero aqui?
# Set Library install directories
install_dir_1=~/Desktop/arduino-1.8.4
install_dir_2=~/Desktop/arduino-1.8.5
install_dir_3=~/Desktop/arduino-1.8.5a

x=0

while [ $x -lt 4 ]; do

    let x=x+1 

    install_dir=install_dir_$x
    #echo $install_dir

    install_dir=$install_dir   
    #echo $install_dir

    dir_Adafruit_SSD1306=$install_dir/libraries/Adafruit_SSD1306/
    echo $dir_Adafruit_SSD1306

done

A saída real é

install_dir_1/libraries/Adafruit_SSD1306/
install_dir_2/libraries/Adafruit_SSD1306/
install_dir_3/libraries/Adafruit_SSD1306/
install_dir_4/libraries/Adafruit_SSD1306/

A saída desejada é

~/Desktop/arduino-1.8.4/libraries/Adafruit_SSD1306/
~/Desktop/arduino-1.8.5/libraries/Adafruit_SSD1306/
~/Desktop/arduino-1.8.5a/libraries/Adafruit_SSD1306/
bash variable-substitution
  • 1 respostas
  • 4584 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve