Substituindo parte de uma string por números de contagem regressiva usando o comando sed [closed]

0

Eu tenho uma string: TestTest12312313 . Eu gostaria de substituir o número 13 nessa string por números de contagem regressiva -1,-2,-3,-4, .... usando o comando sed , então a saída é a seguinte:

TestTest123123-1
TestTest123123-2
TestTest123123-3
TestTest123123-4
.....
.....
.....
    
por unknown 03.09.2018 / 00:25

4 respostas

1

Tente isto:

Tenha o seguinte código em um arquivo

INPUT=$1
CONTENT='echo "$INPUT" | cut -c1-14'
COUNT='echo "${INPUT#"$CONTENT"}"'
for i in $(seq 1 "$COUNT")
do
        echo "$CONTENT-$i"
done

Execute o script com a entrada do tempo de execução, conforme abaixo:

sh file.sh TestTest12312313
TestTest123123-1
TestTest123123-2
TestTest123123-3
TestTest123123-4
TestTest123123-5
TestTest123123-6
TestTest123123-7
TestTest123123-8
TestTest123123-9
TestTest123123-10
TestTest123123-11
TestTest123123-12
TestTest123123-13
    
por 03.09.2018 / 07:40
1

tente

string='TestTest12312313' 
printf '%s\n' ${string%??}-{1..100}

O ${parameter%word} é Expansão do Parâmetro da Shell e exclui os dois últimos caracteres de seu parâmetro.

Acima você pode ajustar o número 100 com qualquer número que você queira continuar a imprimir.

Se você quiser repetir a impressão da string com exatamente os dois últimos dígitos que a sua string termina, você pode fazer o seguinte:

string='testString07'
eval printf '%s\n' ${string%??}-{1..${string:((${#string}-2))}}
testString-01
testString-02
testString-03
testString-04
testString-05
testString-06
testString-07

Esta sintaxe ${string:((${#string}-2))} é proveniente de Expansão de subcadeia do shell ${parameter:startPosition:length} (se length omitido, ele retornará de startPOsition para o final.) startPosition é ((${#string}-2)) , que retorna o comprimento em caracteres de seu string como parâmetro menos 2.

Bem, isso também seria simplificado para:

eval printf '%s\n' ${string%??}-{1..${string#${string%??}}}

se for um arquivo e não uma única string, sugiro usar awk da seguinte forma:

awk -F'..$' '{print $1"-"NR}' infile

isto está definindo o separador de campo do awk com dois últimos caracteres de cada linha (é ..$ um regex que corresponde apenas a dois caracteres no final da linha) e então estamos imprimindo o primeiro campo e seu N umber de R ecord delimitado com hífen. Isso seria encurtado para:

awk -F'..$' '$0=$1"-"NR' infile
    
por 03.09.2018 / 11:42
0

com awk :

$ echo 'TestTest12312313' | awk '{ s = substr($0, 1, length - 2); while (1) printf("%s-%d\n", s, ++n) }'
TestTest123123-1
TestTest123123-2
TestTest123123-3
TestTest123123-4
TestTest123123-5
TestTest123123-6
TestTest123123-7
TestTest123123-8
TestTest123123-9
(etc., forever...)

O código awk extrai a linha de entrada (sua string) e remove os dois últimos caracteres, armazenando o resultado na variável s . Em seguida, ele entra em um loop infinito que imprime essa string junto com um inteiro sempre incremental no formato mostrado acima.

    
por 03.09.2018 / 13:51
-1

Você pode fazer isso usando o seguinte liner:

$ a=1; for i in $(sed 's/13$//' inputfile);do echo "${i}-$((a++))"; done
TestTest123123-1
TestTest123123-2
TestTest123123-3
TestTest123123-4
TestTest123123-5
TestTest123123-6
    
por 03.09.2018 / 07:35