如何将特定单词前面的单词大写

如何将特定单词前面的单词大写

假设我想将 jumped 后面的第一个单词大写。示例如下

原文:

the cow jumped over the moon

修正文本

the cow jumped OVER the moon

我已经尝试过 awk 和 sed,但似乎无法正确完成。

提前致谢

答案1

循环一行中的单词,如果当前单词之前的单词 ( $(i-1)) 是跳了,用 覆盖当前单词 ( $i) toupper($i)

awk '{for (i=1; i<=NF; i++) { if ($(i-1)=="jumped") $i=toupper($i); }}1'

您还可以将记录分隔符更改为空格以避免循环:

awk 'BEGIN{RS=ORS=" "} l=="jumped"{$0=toupper($0)} {l=$0}1'

答案2

sed

  • 使用选项启用扩展正则表达式-E

  • 然后捕获组中的特定单词()及其后的空格,\s这样您的示例特定单词将如下所示(jumped\s)

  • 然后像这样在第二个组中捕获该单词后面的单词(\w+)

  • 然后将这两个组称为\1和,\2并将第 2 组中的所有字母大写,如下\U所示\1\U\2

  • 然后将整个内容放入's/string1/string2/g'其中,s表示搜索string1,当找到时,将其更改为string2g表示全局搜索,即在所有行上搜索和替换。

  • 然后像这样在管道中的文本上使用它:

    echo "the cow jumped over the moon" | sed -E 's/(jumped\s)(\w+)/\1\U\2/g'
    
  • 或者像这样在文件中的文本上使用它:

    sed -E 's/(jumped\s)(\w+)/\1\U\2/g' file
    
  • 示例的结果将如下所示:

    the cow jumped OVER the moon
    

答案3

根据您想要使用输出的方式,您可以执行如下操作(可以根据需要进行修改):

a="the cow jumped over the moon"
echo $a | awk '{
for(i = 1; i <= NF; i++){
if($(i-1)~/jumped/){printf toupper($i)}
else{printf $i}
printf " "}
}'

这将输出: the cow jumped OVER the moon

假设要修改的单词与“jumped”在同一行。

相关内容