Разбить 2-е вхождение шаблона текста в стиле верблюда в sed - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь создать таблицу ключей-значений для приложения Mac, используя sed и awk.До сих пор я дошел до того, что в нем есть такие строки:

"exif:DateTimeOriginal" = "DateTimeOriginal:\t";

Я хочу сделать последний шаг, чтобы получить:

"exif:DateTimeOriginal" = "Date Time Original:\t";

Другими словами, разбить второе вхождениеверблюжьего текста.Я видел sed примерно так:

sed 's/\([A-Z]\)/ \1/g'

, который сделает это глобально, а затем просто сделает 2-е вхождение с:

sed 's/\([A-Z]\)/ \1/2g'

или это 3-е вхождение.Однако, к сожалению, в macos вы не можете объединить число с помощью команды g.

Так есть ли другой способ сделать это?

Кстати, я мог бы сделать так, чтобы вы начали с:

"exif:DateTimeOriginal" = DateTimeOriginal:\t";

То есть пропустите начальную кавычку верблюжьего текста, так что если начальный пробел будет добавлен путем разбиения верблюжьего текста, он будет добавлен после =, что не имеет значения.Затем добавьте начальную цитату после разделения верблюжьего текста.

Ответы [ 5 ]

0 голосов
/ 07 февраля 2019

Это может сработать для вас (GNU sed):

sed 'h;s/\B[[:upper:]]/ &/g;H;x;s/=.*=/=/' file

Сделать копию текущей строки.

Вставьте пробел перед всеми прописными буквами в слове.

Добавить результат к исходной строке.

Удалите хвост исходной строки и заголовок результата.

0 голосов
/ 07 февраля 2019

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

$ echo '"exif:DateTimeOriginal" = DateTimeOriginal:\t"' | perl -F'"' -lane ' $F[2]=~s/(?=[A-Z])/ /g;$F[2]=~s/\s+=\s+/=\"/g; print "\"$F[1]\"$F[2]\"" '
"exif:DateTimeOriginal"="Date Time Original:    "
$
0 голосов
/ 07 февраля 2019

С любым POSIX awk:

$ awk 'BEGIN{FS=OFS="\""} {gsub(/[[:upper:]]/," &",$4); sub(/^ /,"",$4)} 1' file
"exif:DateTimeOriginal" = "Date Time Original:\t";
0 голосов
/ 07 февраля 2019

Вот как вы могли бы сделать это с помощью sed:

sed -E -e ':a' -e 's/^([^=]+)= (.*)([a-z])([A-Z])/\1= \2\3 \4/' -e 'ta'

Идея состоит в том, чтобы применять повторные замены (:a и ta) там, где вы подходите к той части, которую вы не хотите менять([^=]+), а затем вставьте пробел между строчной буквой, за которой следует заглавная буква ([a-z][A-Z]) в оставшейся части.

0 голосов
/ 07 февраля 2019

с GNU awk (не по умолчанию для вашей ОС).

$ awk -F'"' -v OFS='"' '{$4=gensub(/([^A-Z])([A-Z])/,"\\1 \\2","g",$4)}1' file

"exif:DateTimeOriginal" = "Date Time Original:\t";

вам могут понадобиться классы [: lower:] или [: upper:] в зависимости от вашей локали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...