2016-12-19 5 views
2

Как я могу определить случай (строчный, UPPERCASE, CamelCase [, возможно WhATevERcAse]) строки для применения к другой?определить случай строки и применить к другому

Я хотел бы сделать это как oneline с sed или что-то еще.

Используется для проверки орфографии, которая предлагает исправления.

Скажем, я получаю что-то вроде string_to_fix: коррекция:

  • BEHAVIOUR:behavior => получить BEHAVIOUR:BEHAVIOR
  • Behaviour:behavior => получить Behaviour:Behavior
  • behaviour:behavior => остается behaviour:behavior

Дополнительный корпус для обрабатываться:

  • MySpecalCase:myspecialcase =>MySpecalCase:MySpecialCase (так символ будет точкой отсчета, а не положение в слове)
+0

по вашему требованию 'WhATevERcAse': Будет ли правая сторона' поведения: поведение' стать 'BehAvior' или' BehAvioR' или что-то еще? Включите эти случаи в свой пример, если вы хотите, чтобы они обрабатывались. Также объясните, что такое правило для преобразования символов - относительное положение в строке или значении символа или что-то еще? Можете ли вы иметь совсем другие строки, такие как «TheRe: их»? Если так, включите это в свой образец. –

ответ

2

С GNU СЭД:

sed -r 's/([A-Z]+):(.*)/\1:\U\2/;s/([A-Z][a-z]+):([a-z])/\1:\U\2\L/' file 

Пояснения:

  • s/([A-Z]+):(.*)/\1:\U\2/: поиск заглавных букв до : и с помощью обратной ссылки и прописную модификатор \U, изменение буквы после : в верхний регистр
  • s/([A-Z][a-z]+):([a-z])/\1:\U\2\L/: искать слова, начинающиеся с буквы верхнего регистра, и если они найдены, заменить первую букву после : на верхний регистр
4

С AWK вы можете использовать классы POSIX символов для обнаружения случая:

$ cat case.awk 
/^[[:lower:]]+$/ { print "lower"; next } 
/^[[:upper:]]+$/ { print "upper"; next } 
/^[[:upper:]][[:lower:]]+$/ { print "capitalized"; next } 
/^[[:alpha:]]+$/ { print "mixed case"; next } 
{ print "non alphabetic" } 

Jims-MacBook-Air so $ echo chihuahua | awk -f case.awk 
lower 

Jims-MacBook-Air so $ echo WOLFHOUND | awk -f case.awk 
upper 

Jims-MacBook-Air so $ echo London | awk -f case.awk 
capitalized 

Jims-MacBook-Air so $ echo LaTeX | awk -f case.awk 
mixed case 

Jims-MacBook-Air so $ echo "Jaws 2" | awk -f case.awk 
non alphabetic 

Вот пример с двух строк и применяя случай первого ко второму:

BEGIN { OFS = FS = ":" } 
$1 ~ /^[[:lower:]]+$/ { print $1, tolower($2); next } 
$1 ~ /^[[:upper:]]+$/ { print $1, toupper($2); next } 
$1 ~ /^[[:upper:]][[:lower:]]+$/ { print $1, toupper(substr($2,1,1)) tolower(substr($2,2)); next } 
$1 ~ /^[[:alpha:]]+$/ { print $1, $2; next } 
{ print $1, $2 } 

$ echo BEHAVIOUR:behavior | awk -f case.awk 
BEHAVIOUR:BEHAVIOR 

$ echo Behaviour:behavior | awk -f case.awk 
Behaviour:Behavior 

$ echo behaviour:behavior | awk -f case.awk 
behaviour:behavior 
+0

Спасибо за ваш ответ. Я могу сделать то же самое с sed, но это не говорит мне, как применить его к новой строке. –

+0

Ага, хорошо, см. Править. – jas

+0

Большое спасибо, что работает. Я предпочитаю sed oneliner, поскольку он более синтетический, хотя, возможно, менее читабельный. –

1
awk -F ':' ' 
    { 
    # read Pattern to reproduce 
    Pat = $1 
    printf("%s:", Pat) 

    # generic 
    if ($1 ~ /^[:upper:]*$/) { print toupper($2); next} 
    if ($1 ~ /^[:lower:]*$/) { print tolower($2); next} 

    # Specific 
    gsub(/[^[:upper:][:lower:]]/, "~:", Pat) 
    gsub(/[[:upper:]]/, "U:", Pat) 
    gsub(/[[:lower:]]/, "l:", Pat) 

    LengPat = split(Pat, aDir, /:/) 

    # print with the correponsing pattern 
    LenSec = length($2) 

    for(i = 1; i <= LenSec; i++) { 
     ThisChar = substr($2, i, 1) 

     Dir = aDir[ ((i - 1) % LengPat + 1)] 
     if (Dir == "U") printf("%s", toupper(ThisChar)) 
     else if (Dir == "l") printf("%s", tolower(ThisChar)) 
     else printf("%s", ThisChar) 
     } 
    printf("\n") 
    }' YourFile 
  • принять все дела (и с той же концепции, как @Jas для быстрого верхнего или нижнего рисунка)
  • работы для этого strucure только (spearator по :)
  • вторая часть (текст) может быть больше, чем part1, шаблон используется cyclingly
0

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

sed -r '/^([^:]*):\1$/Is//\1:\1/' file 

Используется флаг I, чтобы выполнить безвизовый состязание, а затем заменяет оба экземпляра матча первым.