Как превратить линию в верблюжий чехол? - PullRequest
1 голос
/ 03 февраля 2020

Это выбирает весь текст в одну строку после сопоставления с шаблоном и преобразует его в регистр верблюдов, используя non-alphanumeri c в качестве разделителя, удаляя пробелы в начале и в конце результирующей строки, (1) это не заменяет, если у него есть 2 последовательных не-alphanumeri c символа, например, "2" в приведенном ниже примере, (2) есть ли способ сделать все, используя команду sed вместо grep, cut, sed and tr?

$ echo " hello
world
  title:  this is-the_test string with number 2, to-test CAMEL String
end! " | grep -o 'title:.*' | cut -f2 -d: | sed -r 's/([^[:alnum:]])([0-9a-zA-Z])/\U\2/g' | tr -d ' '
ThisIsTheTestStringWithNumber2,ToTestCAMELString

1 Ответ

1 голос
/ 03 февраля 2020

Чтобы ответить на ваш первый вопрос, измените [^[:alnum:]] на [^[:alnum:]]+, чтобы обозначить один или несколько символов, отличных от alnum.

Вы можете объединить все команды в решение GNU sed, например

sed -En '/.*title: *(.*[[:alnum:]]).*/{s//\1/;s/([^[:alnum:]]+|^)([0-9a-zA-Z])/\U\2/gp}'

См. Онлайн-демонстрацию

Подробности

  • -En - синтаксис POSIX ERE включен (E) и линейный выход по умолчанию, подавленный с помощью n
  • /.*title: *(.*[[:alnum:]]).*/ - соответствует строке, имеющей title:, перехватывающей все после нее до последнего символа alnum в Группу 1 и сопоставляющей остальную часть строки
  • {s//\1/;s/([^[:alnum:]]+|^)([0-9a-zA-Z])/\U\2/gp} - если строка соответствует,
    • s//\1/ - удалить все, кроме шаблона группы 1 (получено выше)
    • s/([^[:alnum:]]+|^)([0-9a-zA-Z])/\U\2/ - сопоставить и захватить начало строки или 1+ неисчислительных символов в Группу 1 (с ([^[:alnum:]]+|^)), а затем захватить глиноземный символ в Группу 2 (с ([0-9a-zA-Z])) и заменить содержимое Группы 2 в верхнем регистре (с \U\2).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...