Remove string usando certos valores (-)

0

Eu tenho o seguinte texto

foo-11.11-fo.o-foo-bar

bar-foo-11.11-22.11

Desejo remover as últimas strings com dois "-".

Resultado esperado:

foo-11.11-fo.o

bar-foo

Eu tentei vários métodos usando o corte, mas nada funciona.

    
por Buvanesh Kumar 25.09.2017 / 13:52

2 respostas

2
$ cat ip.txt 
foo-11.11-fo.o-foo-bar
bar-foo-11.11-22.11

$ rev ip.txt
rab-oof-o.of-11.11-oof
11.22-11.11-oof-rab

$ rev ip.txt | cut -d- -f3- | rev
foo-11.11-fo.o
bar-foo

Inverte cada linha, depois use cut para selecionar todos os campos, exceto os dois primeiros, e depois inverta a saída novamente


Você também pode usar perl , mas imprimirá linhas vazias se qualquer linha de entrada tiver menos de 3 campos

$ perl -F'-' -lane 'print join "-", @F[0..$#F-2]' ip.txt 
foo-11.11-fo.o
bar-foo

Especifique - como delimitador de entrada e, em seguida, imprima todos os dois últimos campos, exceto

    
por 25.09.2017 / 14:00
4

Usando sed :

$ sed 's/-[^-]*-[^-]*$//' file
foo-11.11-fo.o
bar-foo

Isso removerá -X-X no final de cada linha em file , em que X é qualquer string que não inclua - .

Se as strings estiverem em uma variável shell:

$ s='foo-11.11-fo.o-foo-bar'
$ printf '%s\n' "${s%-*-*}"
foo-11.11-fo.o

$ s='bar-foo-11.11-22.11'
$ printf '%s\n' "${s%-*-*}"
bar-foo

ou em uma matriz bash :

$ s=( 'foo-11.11-fo.o-foo-bar' 'bar-foo-11.11-22.11' )
$ printf '%s\n' "${s[@]%-*-*}"
foo-11.11-fo.o
bar-foo

Isso remove qualquer coisa que corresponda ao padrão -*-* no final da sequência na variável s por meio de uma correspondência / remoção de padrão de sufixo. No caso em que s em uma matriz, a remoção é feita em todos os elementos da matriz.

    
por 25.09.2017 / 14:02