2

Как удалить все строки, содержащие символы не ASCII-клавиатуры?

Я столько раз пробовал коды регулярных выражений, но ни один из них не работает так, как должно быть, я даже пробовал этот код [^\x00-\x7F]+ но он не выделил все символы

мне пришла в голову идея использовать этот способ [^a-z0-9``~!@#$%^&*()-_=+[]{}\|;:'"<>,./?] но все еще не работает, потому что некоторые из этих символов не были отменены, как \ / | { } [ ] $ # ^ ( )

  1. Если строка содержит символы, которых нет в списке ниже, я хочу удалить, удалить ее или добавить в закладки

    0123456789`~!@#$%^&*()-_=+[]{}\/|;:'"<>,.?
    abcdefghijklmnopqrstuvwxyz
    ABCDEFGHIJKLMNOPQRSTUVWXYZ
    
  2. Простой пример: здесь можно найти больше таких символов: https://en.wikipedia.org/wiki/List_of_Unicode_characters

    0123456789`~!@#$%^&*()-_=+[]{}\|;:'"<>,./?
    abcdefghijklmnopqrstuvwxyz
    ABCDEFGHIJKLMNOPQRSTUVWXYZ
    ¤©ª«¬¯°±²³´µ¶·¸¹º»¼½¾¿÷ÆIJŒœƔƕƋƕ
    ƜƝƢƸƾDžNJNjǽǾǼɁɀȾɎʒəɼʰʲʱʴʳʵʶʷʸˁˀˇˆ˟ˠ
    ˩˧Ͱͱͳʹͼͻͺ͵ͿΏΔΘΞΛΣΠΦΧΨΩΪΫάέήίΰαβδε
    θηκλμξπςρφχψωϊϋϏώϑϐϓϒϔϕϖϠϟϞϝϜϡϢ
    ϤϣϧϫϬϮϯϰϱ₠₡₢₣₤₥₦₧₨₩₪₫€₭₮₯₰₱₲
    ₳₴₵₶₷₸₹₺₻₼₽₾₿⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜
    ⅝⅞⅟℠℡™℣ℤ℥Ω℧ℨ℩KÅℬℭ℮ℯ⇀⇁ↀↁↂↃↄ
    ⇔⇕⇖⇗⇘⇙⇚⇛⇜⇝⇞⇟⇠⇡⇢⇣⇤⇥⇦⇧⇨⅀⅁⅂⅃⅄ⅅ
    ⅆⅇⅈⅉ⅊⅋⅌⅍ⅎ⅏ⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻⅼⅽ
    
  3. Ожидаемый результат:

    0123456789`~!@#$%^&*()-_=+[]{}\|;:'"<>,./?
    abcdefghijklmnopqrstuvwxyz
    ABCDEFGHIJKLMNOPQRSTUVWXYZ
    

3 ответа3

2

[^\x00-\x7F] работает нормально, но, если вы хотите использовать класс длинных символов, например [^a-z0-9``~!@#$%^&*()-_=+[]{}\|;:'"<>,./?] Вы должны экранировать символы, которые имеют особое значение (т. е. -[]\ и добавить разрыв строки \r , \n .

Ваше регулярное выражение становится:

 [^a-z0-9``~!@#$%^&*()\-_=+\[\]{}\\|;:'"<>,./?\r\n]
 #                    ^    ^ ^   ^            ^^^^

  • Ctrl+H
  • Найди что: [^a-z0-9``~!@#$%^&*()\-_=+\[\]{}\\|;:'"<>,./?\r\n]+$ Но, опять же, [^\x00-\x7F] работает нормально и более читабельно
  • Заменить на: LEAVE EMPTY
  • проверить обернуть
  • проверьте регулярное выражение
  • Заменить все

Результат для данного примера:

0123456789`~!@#$%^&*()-_=+[]{}\|;:'"<>,./?
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0

В Notepad++ это легко:

  1. меню Поиск > Отметить ...

  2. Найти что: [^\x00-\x7F]
    ☑ Отметить линию
    (•) Регулярное выражение

  3. Нажмите Найти все

  4. меню Поиск > Закладка > Удалить отмеченные строки

0

Если вы не знакомы с решением и не привязаны к Notepad++, вы можете установить bash для Win 10, как я показал здесь https://superuser.com/a/1252271/715210 (извините, я всегда возвращаюсь к вашим вопросам с обходными решениями для Linux;))

Я бы решение, в котором , к сожалению , также будет терять апостроф '

  1. откройте bash для Windows поверх меню «Пуск»
  2. Перейдите в папку, где находится ваш файл с папкой cd /mnt/c/path/folder (диск C: включен /mnt /c)
  3. Если ваш файл называется foo.txt, вы можете сгенерировать файл bar.txt с помощью этой команды:

    cat foo.txt | tr -cd '[:alnum:]\n\r~!@#$%^&*()-_=+{}\|;:<>,./?"`' | sed '/^$/d' > bar.txt

Объяснение частей:

cat foo.txt выводит текстовый файл и с конвейером | вывод перенаправляется на команду tr -cd которая удаляет каждый символ, которого нет в списке после betwenn '...'. Followed by a pipe to to remove the empty lines. Last but not least with важное:> bar.txt` мы перенаправляем вывод в файл bar.txt

Благодаря:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .