Проверьте файлы на конвенции

группы получения

Ваш первый пример был близок, но Вы говорите sed то, что Вы хотите взять 2 символа за один раз с \(.\)\(.\) бит, чтобы сделать это с помощью группы получения Вы могли скорректировать его как так:

$ echo ahebhaaa | sed 's/\(.\)/\1\n/g'
a
h
e
b
h
a
a
a

использование и

Относительно почему sed пример с & работы. & в поиске и замене то, чему когда-либо символы соответствовало регулярное выражение. Так все, что не было a \n.

Примеры

$ echo "123 abc" | sed 's/[0-9]*/&&/'
123123 abc

Первое & печатает символы, которые были подобраны шаблоном ([0-9]*), 123. Второе & печатает их во второй раз.

$ echo "123 abc" | sed 's/ab/&&&/'
123 abababc

Шаблон, который мы ищем, ab. Поскольку мы обходим строку 123 abc sed печатает неподобранные символы, 123. Затем строка ab встречен, который в той точке соответствия, что мы ищем и заменяем на. Так sed затем замены это с 3 копиями какой подобранный (abbab). Наконец sed печать c.

Нотация [^\n] создает ряд не конец символа строки. Поэтому думайте sed поскольку это идет по Вашей строке текста, ahebhaaa, это тестирует каждый из этих символов, и высказывание "Является этим не a \n"? Если это не конец символа строки, то sed делает поиск и замену на этом символе и & печать, что было подобрано, т.е. символ, наряду с символом новой строки. Это затем повторяет это, когда это идет ahebhaaa строка.

Ссылки

3
09.12.2014, 17:04
2 ответа

Обнаружение

  • Кодирование UTF-8 : : Файл обычно дает вам кодировку:

     файл - MIME-encoding myfile.txt 

    Обратите внимание, что это Может быть либо «US-ASCII», либо «UTF-8», в зависимости от того, находит ли он некоторые символы UTF-8, поэтому вам нужно будет принять оба.

Следующие пункты в основном требуют, чтобы вы проводят вывод в WC -L (для подсчета количества строк вывода) и проверьте, будет ли это 0 или нет. В качестве альтернативы, они обычно должны иметь возвратную стоимость 0, если они что-то нашли, или 1, если нет (в этом случае ваши требования выполнены):

  • без задних белых пробелов : это работа для GREP , Я думаю:

     grep -e '\ s \ + $' myfile.txt 
  • ньролайн в конце файла : если последний символ по Hexdump или XXD 0A , есть новая линия, и это нормально:

     XXD -PS myfile.txt |  хвост -N 1 |  GREP '0A $' 

    ( Обратите внимание, что, в отличие от других точек, обозначаемых здесь, вы хотите, чтобы это было что-то найти )

  • NO NO-ASCII CHARS : это так же, как «Кодировка UTF-8», за исключением, может быть, немного более строгого.

    Если вы действительно Хотите убедиться, что в файле есть только символы ASCII (см. Ответ @ Anthon), вам, вероятно, понадобится что-то вроде

     XXD -G1 myfile.txt |  CUT-C 10-56 |  GREP '[A-F89] [A-F0-9]' 

    Это поиск любых символов за пределами диапазона ASCII (0x00-0x7f). Это не очень элегантно, хотя.

  • LF для окончания линии : Файл Без каких-либо вариантов сообщите вам что-то вроде

     TEXT ASCII, с терминаторами линии CRLF 

    для скрипта, возможно, что-то вроде следующее может сделать :

     xxd -g1 myfile.txt |  CUT-C 10-56 |  GREP '0D' 

Фиксация

  • Кодировка UTF-8 : есть ICONV (1) . По сути, требуется кодирование «от» ( -F ), кодировку «к» ( -T ) и файл. Кодировка «для», вероятно, UTF-8 , тогда как кодировка «от» может быть получена с использованием файла , как описано в верхней части моего поста:

     File_Encoding = "$  (Файл - - mime-encoding myfile.txt) "
    iconv -f "$ file_encoding" -T 'utf-8' myfile.txt 
  • Нет задних белых пробелов : Это задание для SED , хотя я предпочитаю POSIX Way (то есть нет -I Переключатель), который означает использование PrintF + EX . В любом случае, Regex будет выглядеть что-то вроде S / \ S \ + $ // G . Для POSIX-совместимого способа:

     printf "%% s / \\ s \\ + \ $ // g \ nwq \ n" |  ex -s myfile.txt 

    для несовместичного способа:

     SED -I 'S / \ S \ + $ // G' myfile.txt 
  • Новая линия в конце файла : Приложения UNIX обычно добавляют отсутствующую новую строку в конце файла, когда они его сохраняют. Чтобы использовать это, это немного взлома:

     printf "wq \ n" |  ex -s myfile.txt 

    ( Это фактически просто открывается, сохраняет, выйти )

  • NO NO-ASCII CHARS : см. «Кодирование UTF-8» выше.

  • LF для окончания линии : есть DOS2UNIX (1) . Это должно сделать именно то, что вам нужно.

5
27.01.2020, 21:16

Попробуйте команду file, она уже делает хорошую работу по определению информации о содержимом, хотя и не анализирует полный файл данных.

Если у вас большой файл somefile, в котором первый символ utf-8 не появляется до конца, то файл somefile не распознает его как файл utf-8.

0
27.01.2020, 21:16

Теги

Похожие вопросы