我想用一个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"
但这没有用。此外,我在这个网站上搜索和搜索,但我找不到我的问题的确切答案。
谢谢。
答案 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命令而不是一个!