Shell 删除,直到从特定关键字开始的第一个右括号

Shell 删除,直到从特定关键字开始的第一个右括号,shell,unix,sed,Shell,Unix,Sed,我有一个变量,它包含: var="I am in digital india today i will go home))) and have a dinner" 我想从单词中删除今天的,直到并包括下一个右括号。输出应为: I am in digital india )) and have a dinner 我试过使用sed,但不起作用: $ echo $var | sed 's/today.*)//' I am in digital india and have a dinner 可能有

我有一个变量,它包含:

var="I am in digital india today i will go home))) and have a dinner"
我想从单词
中删除今天的
,直到并包括下一个右括号。输出应为:

I am in digital india )) and have a dinner
我试过使用sed,但不起作用:

$ echo $var | sed 's/today.*)//'
I am in digital india and have a dinner

可能有1-4个闭合括号。我需要删除第一个,剩下的就不用管了。

它可以工作。。。但我不知道你是否想这样

echo $var | sed 's/today.*.e)//'

echo $var | sed 's/today.*)/)/'

如果您使用的是Bash,请利用
extglob
。要检查
extglob
是否处于打开状态,请使用命令
shopt extglob
和命令
shopt-s extglob
。然后:

$ echo "${var/today*([!\)])\)}"
I am in digital india )) and have a dinner
解释:

  • ${var/foo/bar}
    在变量
    $var
  • *(模式)
    匹配给定模式的零次或多次出现
  • *([!\)])\)
    在多次出现“not”后加上“a”)时匹配零

    • 问题在于
      *
      是贪婪的。它将匹配尽可能多的输入,这意味着
      将匹配最后一个括号而不是第一个括号。在大多数其他正则表达式引擎中,您可以通过编写
      *?
      来关闭贪婪。Sed不支持这一点,因此您可以将
      更改为
      [^]
      ,以防止它匹配任何括号

      echo $var | sed 's/today[^)]*)//'
      

      感谢回复@Tomonso-Ejang这将适用于一般情况。但在我的例子中,我有一个文件,其中每一行至少有一个闭合括号,最多有三个或四个闭合括号,因此我想删除,直到第一个括号和其余括号出现。更新以适应现代世界快速变化的需求的挑战!