Używasz wyrażenia regularnego w części „zamień” wyszukiwania / zamiany?

2

Mam dużą ilość tekstu z wcięciem (konturem), w którym brakuje wiodącego znaku wypunktowania:

        some point
            a sub-point

Chcę zastąpić każdą kartę 2 spacjami i dodać myślnik z przodu. Potrzebuję formatu docelowego:

  - some point
    - a sub-point

Znajdź:
mogę użyć wyrażenia regularnego, \t+\Saby znaleźć „dowolną liczbę zakładek, a następnie dowolne spacje”. Działa to dobrze, a funkcja „znajdź” podkreśla początek każdej linii, aż do pierwszego znaku niezawierającego tabulatorów.

Zastąp:
Jak mogę użyć wyrażenia regularnego, aby określić „zamień każdą tabulator na 2 spacje, a następnie jeden myślnik i jedną spację, a następnie oryginalny znak inny niż tabulator”? Konkretnie:

  1. Jak określić zamianę, która ma się odbyć „tyle razy, ile było wyników w znalezieniu”? (Tak więc trzy tabulatory zamieniają się w sześć spacji itp.)
  2. Jak określić dosłowne „jeden łącznik, a następnie jedną spację”?
  3. Jak określić „nie zmieniaj znaku, który nie jest tabulatorem”?

Moje google-fu doprowadziło mnie do koncepcji,\1 ale nie wiem, jak mogę to wykorzystać. Moje testy prób i błędów spowodowały jedynie błędy.
Aktualizacja:
Odkryłem coś o \1: Muszę użyć nawiasów w moim find ciąg: (\t+)(\S)a następnie użyć jej w zastąpienia części: \1- \2. Pomaga mi to rozwiązać powyższe punkty 2 i 3, ale wciąż brakuje mi około 1!
Aktualizacja:
Duh - nr 1 może być prostą operacją znajdowania / zastępowania wyrażeń regularnych, o ile w tekście nie ma żadnych znaków tabulacji. Muszę to teraz zbadać!

Próbuję z Gedit Ubuntu, ale mogę również użyć Notepad ++ lub Sublime, jeśli masz sugestie dotyczące konkretnego edytora.

Torben Gundtofte-Bruun
źródło
Widzę, że wprowadziłeś kilka aktualizacji, kiedy opublikowałem moją odpowiedź. Mam nadzieję, że to załatwiłeś. Jeśli tak, daj nam znać.
LPChip

Odpowiedzi:

1

Możesz to zrobić za pomocą Notepad ++ w dwóch krokach:

Pierwszy krok:

  • Ctrl+H
  • Znajdź co: \t
  • Zamień na:    (2 spacje)
  • zaznacz opcję Zawiń się
  • zaznacz Wyrażenie regularne
  • Replace all

Drugi krok:

  • Znajdź co: ^\h+
  • Zamienić: $0-
  • zaznacz opcję Zawiń się
  • zaznacz Wyrażenie regularne
  • Replace all

Wyjaśnienie:

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

Zastąpienie:

$0      : the whole match (ie. all the spaces at the beginning of each line)
-       : a dash followed by a space
Toto
źródło
1
Szczególnie podoba mi się ta odpowiedź, ponieważ koncentruje się na „początku linii”, co eliminuje potrzebę posługiwania się pierwszą postacią spacji - a także jej jasne i precyzyjne wyjaśnienie.
Torben Gundtofte-Bruun
1

Istnieją dwie metody, których możesz użyć.

Możesz wyszukać cały ciąg + co będzie dalej i użyć grupowania, aby zastąpić go jedną lub więcej grupami, ale nie wszystkimi. To jest miejsce $1lub \1gra.

Możesz także wyszukać tylko tę część, którą chcesz zastąpić, i po prostu zastąp ją inną.

Najpierw zbuduj wyrażenie regularne, które chcesz jawnie zastąpić i wyszukaj. Jeśli wyszukiwanie wyszukuje wiele części ciągu i chcesz zachować coś pośrodku, konieczne jest grupowanie. Przykład: wyszukaj [b]text[/b]i zamień na<b>text</b>

Wyrażenie regularne byłoby czymś podobnym \[b\](.+)\]\/b\]i zastąpiłoby go<b>\1</b>

Jeśli musisz zmienić tylko każde wystąpienie tekstu, które jest jednym ciągiem ciągłym, możesz wyszukać je specjalnie i zastąpić. Na przykład szukając go          -My examplei zamieniając na  - My example(który w zasadzie zastępuje tabulatory dla dwóch spacji i dodaje spację po - , szukałbyś go \t+-i zamieniał na -

Wyrażenie regularne oznacza tutaj: wyszukaj dowolną kartę, która występuje 1 lub więcej razy, po której następuje myślnik. Jeśli wyszukasz ten ciąg bez faktycznej zamiany, zobaczysz, że wybierze tekst, który chcesz zastąpić.

Jeśli chcesz zastąpić dowolną kartę dwiema spacjami, po prostu wyszukaj ją \ti zamień na 

Zauważ, że użyłem spacji, a następnie alt + 255 wszędzie w tym poście, aby wpisać 2 spacje z rzędu, w przeciwnym razie SuperUser skondensuje wszystko do 1 spacji.

LPChip
źródło
Dziękujemy za wyjaśnienie korzystania z \1. W moim przypadku każda linia zaczyna się od dowolnych słów, więc nie mogę podążać za twoim My examplepomysłem.
Torben Gundtofte-Bruun
Tak, możesz. Te słowa są po prostu pomijane podczas wyszukiwania.
LPChip