【问题标题】:Capitalize the first letter matching a pattern大写匹配模式的第一个字母
【发布时间】:2015-05-13 23:49:46
【问题描述】:

我有几十个包含以下文本的文件:

request {
      Request {        
        input("testing")
      }
}

我想使用 sed 将输入中任何文本的首字母大写。例如,我希望测试是测试。我尝试了以下命令来大写所有的开头,但我怎样才能只将它应用于输入?

sed -e "s/\b\(.\)/\u\1/g"

【问题讨论】:

  • 不太清楚为什么testing 必须大写,为什么不request
  • 应该将input("test test") 转换为input("Test test"),还是input("Test Test")
  • input("testing") 应该是 input("Testing")
  • 另外,不同的文件包含不同的内容,所以对于另一个文件,我可能希望输入(“你好”)为输入(“你好”),不会超过一个词在输入中
  • 用正确的描述和更广泛的输入/所需输出来更好地更新您的问题。

标签: linux bash sed


【解决方案1】:

怎么样

sed 's/input("\(.\)/input("\u\1/'

测试

$ echo -e 'request {
      Request {        
        input("testing")
      }
}' | sed 's/input("\(.\)/input("\u\1/'
# Outputs
# request {
#      Request {        
#        input("Testing")
#      }
#}

它有什么作用?

  • /input("\(.\) 匹配input(" 后跟第一个字符(例如t. 匹配的字符在\1 中捕获

  • input("\u\1 替换字符串。 input(" 被替换为它自己。 \u\1\1 中捕获的字符转换为大写。

【讨论】:

  • 值得一提的是,这不符合 POSIX 标准,因此仅适用于某些版本的 sed(例如 GNU sed)。
  • 我在上面发表了评论,我需要保持输入不变,而不是将其转换为测试。
  • @TomFenech 在sed (GNU sed) 4.2.2 中测试过,我不确定旧版本:(
  • @AlexCon 抱歉打错了。已在答案中更正
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
相关资源
最近更新 更多