【问题标题】:How do I use sed to capitalize the last instance in each line of a word that starts with "/"?如何使用 sed 将以“/”开头的单词的每一行中的最后一个实例大写?
【发布时间】:2021-07-17 02:25:23
【问题描述】:

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

word1
/word1

我想保留第一个 word1 不变并将第二个 word1 大写

word1
/WORD1

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

word1 /word1 /word1

会变成

word1 /word1 /WORD1

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

【问题讨论】:

  • s@/word1@\U&@ -- 你不限于/ 作为唯一可能的标志;这只是一个常见的选择。
  • 这似乎适用于上面的示例,但如果在同一行中出现三个 word1,它将大写第二个 word1 并忽略前面带有“/”的第三个。如何使用该命令将每行中最后一次出现的 word1 大写?
  • 最后一个,还是每个实例包括最后一个?如果您想要 每个 实例,请在最后的印记之后添加 g(在我的第一条评论中的 @ 之后)。而且由于问题的主体并未表明您只想替换最后一个实例,因此请确保您进行了编辑。
  • 对不起,我只需要将每行的 word1 的最后一个实例大写。我会立即编辑问题的正文,再次抱歉!
  • 好的。 “每个单词”是指“特定单词 word1 的每个实例”,还是“每个字母单词”,还是别的什么?

标签: shell


【解决方案1】:

可以在https://ideone.com/htALOt看到--

sed -Ee 's@(.*)(/word1)@\1\U\2@'

(.*) 尽可能从头开始匹配,遇到\1 时原样复制。 \U 告诉 GNU sed 开始以全大写形式进行替换,然后 \2 以全大写形式写入该内容。

【讨论】:

  • 非常感谢!
  • 如果这解决了您的问题,单击答案左侧的复选框会将该答案标记为已解决问题(并将更改主页/列表中问题本身的格式以标记它已解决)。
【解决方案2】:

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 "/正则表达式/

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&/' (我不太确定反斜杠需要放在哪里,但是通过这个和尝试你应该能够用转义的 " /" 之前,并且只有这个词应该大写。

【讨论】:

    猜你喜欢
    • 2017-02-19
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多