检测字符串大小写并应用于另一个大小写

时间:2016-12-19 07:43:39

标签: regex bash awk sed

如何检测要应用于另一个字符串的字符串(小写,大写,CamelCase [,可能是WhATevERcAse])?

我想用sed或其他什么来做它。

这用于提出更正的拼写检查。

让我说我得到类似string_to_fix的内容:更正:

  • BEHAVIOUR:behavior =>得到BEHAVIOUR:BEHAVIOR
  • Behaviour:behavior =>得到Behaviour:Behavior
  • behaviour:behavior =>仍然是behaviour:behavior

需要处理的额外案件:

  • MySpecalCase:myspecialcase => MySpecalCase:MySpecialCase(所以字符将是参考点,而不是单词中的位置)

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

使用GNU sed:

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/:搜索以大写字母开头的单词,如果找到,请将:后的第一个字母替换为大写

答案 2 :(得分: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相同的概念,用于快速上下模式)
  • 仅适用于此结构(:)的
  • 第二部分(文本)可能比第1部分长,模式可循环使用

答案 3 :(得分:0)

这可能适合你(GNU sed):

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

这使用I标志进行无壳匹配,然后将匹配的两个实例替换为第一个。