【问题标题】:How to replace with one sed command first n letter to uppercase如何用一个 sed 命令替换第一个 n 字母为大写
【发布时间】:2017-05-01 12:00:37
【问题描述】:

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

例如“马德里”到“马德里”。 (n=3)

我知道如何用这个命令把第一个字母变成大写:

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

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

我试图改变

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

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

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

谢谢。

【问题讨论】:

  • 荣誉,这是任何 SO 初学者了解如何提问的完美示例。

标签: regex sed scripting


【解决方案1】:

我从您对\U 的使用推断出您正在使用GNU sed

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

  • \&lt; 用于代替\b,因为与后者不同,它只匹配单词的开头谢谢Casimir et Hippolyte

不过,上面替换了单词开头的任意 3 个字符。

将其限制为最多 $n 字母

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

至于你的尝试:

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

相反,您必须确保您的唯一一个捕获组(您可以在替换中将其引用为 \1)本身捕获所需数量的字符 - 这就是 {&lt;n&gt;} 量词的用途;相关的{&lt;m&gt;,&lt;n&gt;} 构造匹配范围的重复。

【讨论】:

  • "... 并且还提供更多功能":特别是单词边界\b,但请注意使用\&lt; 代替\b 可能是特别是如果字符串包含一个以上的单词,至少用 n 个非单词字符分隔(或者更少,因为您使用了{1,n})。但没关系,因为这些非单词字符没有大小写。
【解决方案2】:

这可能对你有用(GNU sed):

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

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

注意这是两个 sed 命令,不是一个!

【讨论】:

    猜你喜欢
    • 2020-05-18
    • 2019-08-18
    • 2011-05-17
    • 1970-01-01
    • 2013-05-21
    • 2013-09-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    相关资源
    最近更新 更多