从特定关键字开始删除直到第一个关闭括号

时间:2017-09-19 11:00:57

标签: shell unix sed

我有一个变量,其中包含:

var="I am in digital india today i will go home))) and have a dinner"

我想从单词today中删除直至并包含下一个右括号。输出应为:

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个小括号。我需要删除第一个,然后单独留下。

3 个答案:

答案 0 :(得分:1)

如果您正在使用Bash,请使用extglob。要检查extglob是否已启用,请命令shopt extglob以及它是否已关闭命令shopt -s extglob。然后:

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

解释:

  • ${var/foo/bar}在变量foo
  • 中替换bar $var {第一次出现} *(PATTERN)
  • *([!\)])\)匹配给定模式的零次或多次出现
  • string fileNameAndExtension = "thisFile.pdf"; string fullPath = "../folder/files/" + fileNameAndExtension; Response.Clear(); Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileNameAndExtension ); Response.TransmitFile(fullPath); Response.End(); 在更多出现的" 后跟)"
  • 时匹配零

答案 1 :(得分:1)

问题在于outFile.WriteLine("{0,-20}{1,-20}{2,-20}{3,-20}{4,-20}{5,-20}", 1, 2, 3, 4, 5, 6) 是贪婪的。它将匹配尽可能多的输入,这意味着.*将匹配最后一个括号而不是第一个括号。在大多数其他正则表达式引擎中,您可以通过编写)来关闭贪婪。 Sed不支持,因此您可以将.*?更改为.,以防止它与任何括号匹配。

[^)]

答案 2 :(得分:-1)

它有效...但我不知道你是否想要这样......

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

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