如何用一个sed命令替换第一个n字母到大写

时间:2016-12-15 19:14:33

标签: regex sed scripting

我想用一个sed命令替换第一个n字母大写。

示例'马德里'到了MADrid'。 (N = 3)

我知道如何使用此命令将第一个字母更改为大写:

    sed -e "s/\b\(.\)/\U\1/g"

但我不知道如何为我的问题更改此命令。

我试图改变

    sed -e "s/\b\(.\)/\U\1/g"

    sed -e "s/\b\(.\)/\U\3/g"

但这没有用。此外,我在这个网站上搜索和搜索,但我找不到我的问题的确切答案。

谢谢。

2 个答案:

答案 0 :(得分:4)

我使用\U推断您使用的是 GNU sed

n=3
echo 'madrid' | sed -r 's/\<(.{'"$n"'})/\U\1/g'  # -> 'MADrid'
  • 我省略了不必要的-e选项
  • 我添加了-r以启用对扩展正则表达式的支持,这些正则表达式具有更熟悉的语法并提供更多功能。
  • 我正在使用单引号 sed脚本,并在中拼接了一个shell变量值,以避免混淆shell展开前面,sed本身解释的内容。

  • \<代替\b,因为与后者不同,它仅匹配单词的 start 谢谢,{{3 }}

然而,上面替换了一个单词开头的任何3个字符。

将其限制为最多 $n 字母

sed -r 's/\<([[:alpha:]]{1,'"$n"'})/\U\1/g'

至于你的尝试:

您尝试\3中的sed -e "s/\b\(.\)/\U\3/g"是指正则表达式中的第三个​​捕获组(带括号的子表达式(...))(不存在) ,它指的是3次重复。

相反,您必须确保您的唯一捕获组(您可以在替换中引用为\1)本身捕获尽可能多的字符 - 这就是{<n>}量词的含义是为了;相关的{<m>,<n>}构造匹配重复的范围

答案 1 :(得分:0)

这可能适合你(GNU sed):

 sed -r 's/[a-z]/&\n/'"$n"';s/^([^\n]*)\n/\U\1/' file

$n是前n个字母。将单词边界问题放在一边将n a-z个连续或非连续的字母转换为大写,即A-Z

N.B。这是两个sed命令而不是一个!