Para substituir% marks, mas não \% em Perl Regex

3

Estou pensando em como você pode substituir as marcas [^\]% , mas não as marcas \% no comando sed dessa resposta . Eu acho que olhar para trás não é necessário.

Meu comando Sed atual, mas eu acho que Perl é uma obrigação aqui

cat something | sed 's#%.*</#</#'                

que remove também tudo após o sinal % , ou seja, todos os comentários no LaTeX, mas não valores percentuais.

Minha tentativa Perl sem sucesso

cat something | perl 's#[^\]%.*</#</#'

onde eu não sei como fazer o Perl pegar a saída padrão do cat.

Dados

------------------------------
Protocol of pre-eclampsia
------------------------------
Monitoring in 90\% cases

Antihypertensives when % this is a comment, please, remove me!
$SBP/DBP > 160/110$; slowly.     
------------------------------

Saída desejada

------------------------------
Protocol of pre-eclampsia
------------------------------
Monitoring in 90\% cases

Antihypertensives when
$SBP/DBP > 160/110$; slowly.     
------------------------------

Como você pode substituir os sinais % , mas não \% ? Se você puder fazer isso por Sed, por favor, comente.

    
por Léo Léopold Hertz 준영 30.05.2015 / 10:18

3 respostas

3

Como muitas, se não a maioria, de ferramentas de análise de texto, perl pode receber entrada da linha de comando, não há necessidade de cat . Você só precisa de -e , que permite passar um script como um parâmetro de linha de comando e -n , que significa "executar o script em cada linha de entrada". Como alternativa, você pode usar a opção -p , que significa "executar o script em cada linha de entrada e, em seguida, imprimir essa linha". Estes dois comandos são equivalentes (mas o segundo é um uso inútil de gato clássico, use o primeiro):

perl -pe 's/foo/bar/' file
cat file | perl -pe 's/foo/bar/'

Agora, se bem entendi, você deseja excluir todos os comentários do LaTeX (embora não seja isso que a sua pergunta indique). Nesse caso, um lookbehind é a maneira mais fácil:

perl -pe 's/(?<!\)%.*//' file 

Seu regex também deve funcionar, você só precisa manter o caractere correspondente antes do % e escapar da barra invertida:

perl -pe 's/(^|[^\]+)%.*/$1/' file

Você pode fazer o mesmo com o GNU sed :

sed -r 's/(^|[^\])%.*//' file
    
por 30.05.2015 / 12:25
2

Se você quiser apenas substituir o que segue % , mas não o que segue \% , em Perl, a maneira mais fácil é com um lookbehind negativo : corresponde apenas %.* se não for precedido por uma barra invertida.

perl -pe 's/(?<!\)%.*//'

No entanto, isso não corresponderá a algo como Hello world.\%wibble . Para isso, você precisa verificar se o % é precedido por um número par de barras invertidas. Você não pode fazer isso com um lookbehind, porque os lookbehinds do Perl só suportam padrões de comprimento fixo. Em vez disso, combine as barras invertidas no regexp e use um lookbehind para garantir que o regexp capture todas elas.

perl -pe 's/(?<!\)((?:\\)*)%.*/$1/'

Você pode fazer isso com ferramentas que não suportam lookbehind também. Nesse caso, você precisará usar uma sucessão de comandos de substituição ou combinar as barras invertidas e copiá-las para o texto de substituição.

sed -e 's/^\(\(\\\)*\)%.*//' -e 's/\([^\]\(\\\)*\)%.*//'

Observe que, se você estiver processando um documento LaTeX, haverá outros sinais de porcentagem que talvez precisem permanecer, por exemplo, em blocos verbatim. Isso não pode ser feito apenas com regexps.

    
por 31.05.2015 / 02:23
0

Um idioma comum para substituir caracteres sem escape em perl é com:

$ printf '%s\n' '% \% \% \\%' | perl -pe 's/(\.)|%/$1||"<replacement>"/ge'
<replacement> \% \<replacement> \\%

Para remover tudo a partir de um % :

sem escape
perl -pe 's/(\.)|%.*/$1/g'

Se o seu sed suporta -E (FreeBSD / GNU):

sed -E 's/(\.)|%.*//g'

Ou com o GNU sed :

sed 's/\(\.\)\|%.*//g'

Quando o operador de alternância RE não estiver disponível (como no RE básico padrão), você pode usar \{0,1\} em vez disso:

sed 's/\(\(\(\.\)\{0,1\}[^\%]*\)*\)\(%.*\)\{0,1\}//'
    
por 31.05.2015 / 23:18

Tags