Utilizando regex na parte “replace” de uma pesquisa / substituição?

2

Eu tenho uma grande quantidade de texto recortado por guias (delineado) que não possui um caractere principal:

        some point
            a sub-point

Eu quero substituir cada guia por dois espaços e adicionar um hífen na frente. Este é o formato de destino de que preciso:

  - some point
    - a sub-point

Encontrar:
Eu posso usar o regex \t+\S para encontrar "qualquer número de guias, seguido por qualquer espaço não-branco". Isso funciona muito bem, e a função "find" destaca o início de cada linha, até e incluindo o primeiro caractere sem tabulação.

Substituir:
Como posso usar o regex para especificar "substituir cada guia por dois espaços, seguido por um hífen e um espaço, seguidos pelo caractere original sem tabulação"? Especificamente:

  1. Como eu especifico a substituição para acontecer "quantas vezes houvesse correspondências na busca"? (Então, três guias se tornariam seis espaços, etc.)
  2. Como eu especifico o literal "um hífen e depois um espaço"?
  3. Como eu especifico "manter o caractere sem tabulação inalterado"?

Meu google-fu me levou ao conceito de , mas não vejo como posso Use isso. Meu teste de tentativa e erro produziu apenas erros.
Atualização:
Eu descobri uma coisa sobre : devo usar parênteses na minha string find : (\t+)(\S) e então usar isso na parte replace : - . Isso me ajuda a resolver os itens 2 e 3 acima, mas ainda estou perdendo o número 1!
Up-Update:
Duh - # 1 pode ser uma ação simples de localizar / substituir não-regex, desde que não haja caracteres de tabulação em outras partes do texto. Isso é algo que eu preciso investigar agora!

Estou tentando com o Gedit do Ubuntu, mas também posso usar Notepad ++ ou Sublime se você tiver sugestões específicas de editor.

    
por Torben Gundtofte-Bruun 27.01.2018 / 15:00

2 respostas

1

Você poderia fazer isso com o Notepad ++ em duas etapas:

Primeiro passo:

  • Ctrl + H
  • Encontre o que: \t
  • Substitua por: (2 espaços)
  • check Embrulhe
  • verificar expressão regular
  • Substituir todos

Segundo passo:

  • Encontre o que: ^\h+
  • Substituir por: $0-
  • check Embrulhe
  • verificar expressão regular
  • Substituir todos

Explicação:

^       : beginning of line
\h+     : 1 or more horizontal spaces

Substituição:

$0      : the whole match (ie. all the spaces at the beginning of each line)
-       : a dash followed by a space
    
por 27.01.2018 / 17:37
1

Existem dois métodos que você pode usar.

Você pode pesquisar a string inteira + o que vem a seguir e usar agrupamentos para substituí-la por um ou mais grupos, mas não por todos. É aqui que entra em jogo $1 ou .

Você também pode pesquisar apenas a parte que deseja substituir e substituí-la por outra.

Primeiro, crie a regex que você deseja substituir explicitamente e pesquise por ela. Se sua pesquisa pesquisar várias partes de uma string e você quiser manter algo no meio, o agrupamento será necessário. Exemplo: procure por [b]text[/b] e substitua por <b>text</b>

Seu regex seria algo como \[b\](.+)\]\/b\] e substitua por <b></b>

Se você precisar alterar apenas todas as ocorrências de texto que são uma sequência contínua, procure especificamente por ela e substitua-a. Por exemplo, pesquisando por          -My example e substituindo por  - My example (que basicamente substitui as guias por dois espaços e adiciona um espaço após o -, você procuraria por \t+- e substituiria por  -

O regex aqui significa: pesquise por qualquer guia que ocorra 1 ou mais vezes, seguida por um hypen. Se você procurar por esta string sem substituí-la, verá que ela selecionará o texto que você deseja substituir.

Se você quiser substituir qualquer guia por dois espaços, basta pesquisar por \t e substituí-la por  

Observe, usei um espaço seguido por um alt + 255 em todos os lugares neste post para digitar 2 espaços seguidos, caso contrário, o SuperUser condensa tudo em um espaço.

    
por 27.01.2018 / 15:16