如何检测要应用于另一个字符串的字符串(小写,大写,CamelCase [,可能是WhATevERcAse])?
我想用sed或其他什么来做它。
这用于提出更正的拼写检查。
让我说我得到类似string_to_fix的内容:更正:
BEHAVIOUR:behavior
=>得到BEHAVIOUR:BEHAVIOR
Behaviour:behavior
=>得到Behaviour:Behavior
behaviour:behavior
=>仍然是behaviour:behavior
需要处理的额外案件:
MySpecalCase:myspecialcase
=> MySpecalCase:MySpecialCase
(所以字符将是参考点,而不是单词中的位置)答案 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
:
)的答案 3 :(得分:0)
这可能适合你(GNU sed):
sed -r '/^([^:]*):\1$/Is//\1:\1/' file
这使用I
标志进行无壳匹配,然后将匹配的两个实例替换为第一个。