【问题标题】:Delete words with capital letters in bash在bash中删除带有大写字母的单词
【发布时间】:2019-03-04 21:59:54
【问题描述】:

如何删除 BASH 中字符串中包含大写字母的单词? 例如。

输入:

Taco burrito Mexico fiesta

输出:

burrito fiesta

我在 Stack Overflow 上看到的解决方案对我不起作用,因为我正在使用的 linux 机器不接受 -r 开关。

【问题讨论】:

  • 你有哪个sed
  • 你能链接到你在这里看到的解决方案吗?
  • 大写字母总是单词的第一个字母吗?
  • @anubhava 的解决方案似乎成功了!
  • 就我而言,是的,我文件中的单词仅以大写字母开头

标签: bash sed tr


【解决方案1】:

你可以使用这个sed:

s='Taco burrito Mexico fiesta'
sed 's/[[:upper:]][^[:blank:]]*[[:blank:]]*//g' <<< "$s"

burrito fiesta

详情:

  • [[:upper:]]:匹配大写字母
  • [^[:blank:]]:匹配除空格或制表符之外的任何字符
  • [[:blank:]]:匹配空格或制表符

【讨论】:

  • 大写字母不在单词前面怎么办?尽管 OP 的示例只有这个,但问题并没有将大写限制为仅作为单词的第一个字符。事实上,您的解决方案会将fooBar 变成foo,这会删除一个单词的部分
  • @Bohemian 如果这是 OP 的要求,我会很乐意照顾。 sed 中的单词边界与平台无关。我早上会检查这个线程,晚安。
【解决方案2】:
$ echo Taco burrito Mexico fiesta | awk '{gsub(/ (\S*[A-Z]\S*)|(\S*[A-Z]\S* )/, "")}1'
burrito fiesta

【讨论】:

    【解决方案3】:

    为了好玩,perl

    perl -aE 'say "@{[ grep {not /^[[:upper:]]/} @F ]}"' file
    

    【讨论】:

      【解决方案4】:

      bash:

      set -- Taco burrito Mexico fiesta ; LC_ALL=C; echo ${@/*[A-Z]*}
      

      或者:

      a=(Taco burrito Mexico fiesta) ; LC_ALL=C; echo ${a[@]/*[A-Z]*}
      

      输出(任一):

      burrito fiesta
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-23
        • 1970-01-01
        • 2014-11-28
        • 1970-01-01
        相关资源
        最近更新 更多