Retira o padrão de palavras no final da string usando sed

3

Eu tenho a seguinte string:

ksh -x SCRIPT2.ksh $BUSSINESSDATE & PID=$!; ksh -x SCRIPT1.ksh $BUSSINESSDATE & PID=$!;

Eu quero remover a última palavra & PID=$!; . O resultado desejado é:

ksh -x SCRIPT2.ksh $BUSSINESSDATE & PID=$!; ksh -x SCRIPT1.ksh $BUSSINESSDATE

Nota : que eu tenho & PID=$!; no meio da string, eu só preciso me livrar da última palavra que contém & PID=$!;

Estou usando sed para alcançar isso. Mas isso não parece produzir o resultado esperado.

sed 's/\(\& PID=\$\!\).*$//'
    
por Sas 12.01.2015 / 21:42

3 respostas

3
sed -e 's/& PID=\$\!;$//'

O $ no final ancora no final da string.

    
por 12.01.2015 / 22:14
1

Todas as respostas são boas até agora, mas para este exemplo concreto você pode economizar seu tempo e escrever alguns caracteres a menos:

sed 's/ & [^ ]*$//'

ou melhor ainda

sed 's/ & \S*$//'
    
por 12.01.2015 / 23:52
1

Para remover a última ocorrência de um padrão em uma linha, basta apertá-lo.

sed 's/\(.*\)& PID=$!;//'

Isso corresponderá o máximo possível em antes de corresponder à string, de modo que sempre removerá apenas a última ocorrência, independentemente de a string ser ou não removida, na verdade, no final da linha.

Sua tentativa:

 sed 's/\(\& PID=\$\!\).*$//'

... faz algo parecido com o oposto. Ele retira todos os caracteres em uma linha que começa com a primeira ocorrência da string e segue até o final da linha.

Lembre-se da regra leftmost-longest - um regexp sempre começará sua correspondência o mais à esquerda na string como deveria e continuará correspondendo pelo maior tempo possível.

Observe que, se você quiser remover apenas n últimos caracteres, em seguida, com gnu sed

sed -E 's/.{9}$//'

Aqui, a opção -E é necessária para usar expressões regulares estendidas.

    
por 12.01.2015 / 22:20