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