假设我想将 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
,当找到时,将其更改为string2
并g
表示全局搜索,即在所有行上搜索和替换。然后像这样在管道中的文本上使用它:
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”在同一行。