Bash 如何将一行转换为驼峰大小写?

Bash 如何将一行转换为驼峰大小写?,bash,shell,sed,Bash,Shell,Sed,这将在模式匹配后拾取单行上的所有文本,并使用非字母数字作为分隔符将其转换为驼峰大小写,删除结果字符串开头和结尾的空格,(1)如果它有两个连续的非字母数字字符,则不会替换,例如下面的示例中的“2”。(2)是否有一种方法可以使用sed命令而不是使用grep、cut、sed和tr来执行所有操作 $ echo " hello world title: this is-the_test string with number 2, to-test CAMEL String end! " | grep

这将在模式匹配后拾取单行上的所有文本,并使用非字母数字作为分隔符将其转换为驼峰大小写,删除结果字符串开头和结尾的空格,(1)如果它有两个连续的非字母数字字符,则不会替换,例如下面的示例中的“2”。(2)是否有一种方法可以使用sed命令而不是使用grep、cut、sed和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

要回答您的第一个问题,请将
[^[: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:
    的行,该行在组1中捕获最后一个alnum字符,并匹配该行的其余部分
  • {s//\1/;s/([^[:alnum:]+|^)([0-9a-zA-Z])/\U\2/gp}
    -如果行匹配,
    • s//\1/
      -删除除第1组模式以外的所有模式(如上所述)
    • s/([^[:alnum:]+|^)([0-9a-zA-Z])/\U\2/
      -匹配并捕获字符串开头或1+非alnum字符到组1(使用
      ([^[:alnum:]+|^)
      )中,然后将alnum字符捕获到组2(使用
      ([0-9a-zA-Z])
      )中,并替换为大写的组2内容(使用
      \U\code>)

[^[:alnum:][]
更改为
[^[:alnum:][]+
以获得一个或多个非alnum字符。感谢@WiktorStribiżew,这起了作用。尝试
sed-En'/.*title::.+/{s/\1/\s/([^[^[:alnum:][zaz]+\U\U\2/gp是的,它起了作用@WiktorStribiżew echo
test title://这是一个测试,sed./.-//([^[:alnum:][+|^ |$)([0-9a-zA-Z])/\U\2/gp}'
这给了
thisistest,&
@rodee一个很好的答案,我忘了这行的其余部分不是字母数字的。修复。