Substitua a sequência de texto e capture o que está no meio

1

Estou editando um documento LaTeX e preciso alterar todas as instâncias de \parallel something \parallel para \norm{something} . Às vezes, não há espaço entre os "paralelos" e "alguma coisa". Estou tentando usar

$ sed -i 's/\parallel[.*]\parallel/\norm\{\}/g' a.txt  $

mas retorna um erro de "Referência inválida". Qual é o código sed correto?

    
por campe 23.11.2016 / 18:42

4 respostas

2

Quando você faz isso:

$ sed -i 's/\parallel[.*]\parallel/\norm\{\}/g' a.txt

, você não está usando grupos de captura.

Em [] , você especifica a classe de caractere. A classe de caracteres é um par de símbolos que podem ser substituídos por um deles. Assim, RE como [.*] corresponde exatamente a um de . ou * , não de "nenhuma sequência de caracteres".

Os grupos de captura são indicados por \(RE\) . Assim, você deve substituir [] por \(\) , assim:

$ sed -i 's/\parallel\(.*\)\parallel/\norm{}/g' a.txt

, e você poderá acessá-lo com .

    
por 20.01.2017 / 15:31
0
sed -i -e 's/\parallel\s\+\(.*\S\)\s*\parallel/\norm {}/g' a.txt

na string de substituição refere-se ao primeiro \( ... \) no padrão de pesquisa.

Se você prefere a sintaxe de expressão regular "estendida",

sed -i -r -e 's/\parallel\s+(.*\S)\s*\parallel/\norm \{\}/g' a.txt
    
por 23.11.2016 / 20:32
0

replace:

$ sed -i 's/\parallel[.*]\parallel/\norm\{\}/g' a.txt $

com isto:

$ sed -i 's/\parallel\(.*\)\parallel/\norm\{\}/g' a.txt

Isso deve funcionar

    
por 23.11.2016 / 21:09
0

Eu não sei sobre algo, então eu usei [: alnum:]

sed -r 's#\parallel[ ]*([[:alnum:]]+)[ ]*\parallel#\norm{}#g'
    
por 20.01.2017 / 14:47

Tags