首页 > 解决方案 > 如何使用 sed 将以“/”开头的单词的每一行中的最后一个实例大写?

问题描述

我试图将每个以“/”开头的单词大写,同时使用 sed 忽略不以“/”开头的同一个单词。例如,如果输出有

word1
/word1

我想保持第一个 word1 不变并将第二个 word1 大写成为

word1
/WORD1

如果文件在同一行中有多个 word1,我希望它大写 word1 的最后一个实例,所以

word1 /word1 /word1

会成为

word1 /word1 /WORD1

我已经尝试过sed 's/word1/\U&/',但它只是将文件中的每个 word1 大写,我不太确定如何在搜索字符串中包含“/”,因为如果我直接添加它只会引发错误。

标签: shell

解决方案


https://www.gnu.org/software/sed/manual/html_node/The-_0022s_0022-Command.html

“ / 字符可以在任何给定的 s 命令中统一替换为任何其他单个字符。 / 字符(或任何其他用于代替它的字符)只能出现在正则表达式或替换中,前提是它前面有一个 \ 字符。 "

https://www.gnu.org/software/sed/manual/html_node/Regexp-Addresses.html#Regexp-Addresses "/regexp/

This will select any line which matches the regular expression regexp. If regexp itself includes any / characters, each must be escaped by a backslash (\). "

我没有任何使用 sed 的经验,但在我看来,您可以使用正则表达式来具体指定您想要大写的模式。在正则表达式中,您可以使用字符“/”,但您需要使用反斜杠对其进行转义。所以尝试类似的东西

sed 's/word1/\U&/' (我不太确定反斜杠需要放在哪里,但是通过这个和尝试你应该能够用转义的“/”给出你的单词的正则表达式并且只有这个词应该大写。


推荐阅读