rsync-символы, отличные от ascii

grep -E '^([^,]*,){5}Happy' <in >out

Это позволит найти Happy только если он находится непосредственно рядом с 5-й запятой. Если вы хотите найти его в любом месте 6-го поля, то добавьте немного передышки:

grep -E '^([^,]*,){5}[^,]*Happy' <in >out

Если вам нужен просто подсчет совпавших строк, используйте опцию -c:

grep -cE '^([^,]*,){5}[^,]*Happy' <in >out

Я хорошо знаком с регулярными выражениями, но даже если бы не был знаком, думаю, я бы все равно выбрал синтаксис re, а не другие виды. Как только вы освоите некоторые основы, все остальное становится понятно. Регулярные выражения описывают входные данные, комбинируя несколько основных строительных блоков любым количеством способов.

  • * Kleene Star

    • указывает на то, что непосредственно предыдущее выражение встречается 0 или более раз
  • [ выражение в скобках ]

    • указывает на появление любого из (возможно ^ отрицаемого) набора содержащихся символов
  • { min , max } повторение

    • задает счетчик вхождений для непосредственно предыдущего выражения

    • расширенный regexp ? метасимвол - это просто сокращение для {0,1}.

  • ( подвыражение )

    • собирает все содержащиеся выражения в одно выражение.
  • . символ

    • соответствует любому одиночному символу
  • ^|$

    • указывает либо ^ начало строки для следующего выражения, либо | чередование между выражениями, либо $ конец строки

Это основы. Синтаксис расширенных регулярных выражений POSIX -Eтакже включает Kleene + - который идентичен * во всех отношениях, за исключением того, что он требует по крайней мере одного совпадения для предыдущего выражения. Существуют также всевозможные тонкости, связанные с [ скобочными выражениями ] - особенно с внутренними [(:|.|=) классами символов (=|.|:)] и тем, как они соответствуют повторениям. И большинство реализаций фактически расширяют расширенный синтаксис re, по крайней мере, для обработки базовых regexp \[num] обратных ссылок на более раннее ( подвыражение ).

Но, учитывая только основы, любое из приведенных выше выражений или любой другой отдельный символ является выражением сам по себе, и все они объединяются в общее выражение для описания желаемого соответствия.

Сложите все это вместе, и выражение grep, приведенное выше, будет выглядеть так:

  • ^([^,]*,){5}Happy

    • Начиная с крайней левой позиции, совпадающая строка должна содержать не более и не менее 5 последовательностей из 0 и более символов без запятой, за каждой из которых сразу следует символ запятой, а за всеми ними - строка Happy.
6
18.06.2018, 09:22
1 ответ

Нужно использовать --iconv.

Из справочной страницыhttps://linux.die.net/man/1/rsync

--iconv=CONVERT_SPEC 
 Rsync can convert filenames between character sets using this option. 
 Using a CONVERT_SPEC of lq.rq tells rsync to
 look up the default character-set via the locale setting. Alternately,
 you can fully specify what conversion to do by giving a local and a
 remote charset separated by a comma in the order --iconv=LOCAL,REMOTE,
 e.g. --iconv=utf8,iso88591. This order ensures that the option will
 stay the same whether you're pushing or pulling files. Finally, you
 can specify either --no-iconv or a CONVERT_SPEC of lq-rq to turn off
 any conversion. The default setting of this option is site-specific,
 and can also be affected via the RSYNC_ICONV environment variable.
6
27.01.2020, 20:28

Теги

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