Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用sed从字符串中删除括号_Regex_Unix_Sed - Fatal编程技术网

Regex 使用sed从字符串中删除括号

Regex 使用sed从字符串中删除括号,regex,unix,sed,Regex,Unix,Sed,我试图使用sed(1)从字符串中删除括号,但仅当括号以特定字符串开头时。例如,我想将一个字符串(如歌曲名称(f/特色艺术家)(混音))更改为歌曲名称f/featuredarist(混音)。我怎样才能做到这一点 我目前正在尝试以下方法: echo "Song Name (f/ featuredartist) (Remix)" | sed s/"(f\/ [a-z]*)"/"f\/ "/ 但所有这些都是返回歌曲名f/(混音) 还要注意:任何东西都介于f/和)之间,而不仅仅是我的工作尝试所暗示的[a

我试图使用sed(1)从字符串中删除括号,但仅当括号以特定字符串开头时。例如,我想将一个字符串(如
歌曲名称(f/特色艺术家)(混音)
)更改为
歌曲名称f/featuredarist(混音)
。我怎样才能做到这一点

我目前正在尝试以下方法:

echo "Song Name (f/ featuredartist) (Remix)" | sed s/"(f\/ [a-z]*)"/"f\/ "/
但所有这些都是返回
歌曲名f/(混音)

还要注意:任何东西都介于
f/
之间,而不仅仅是我的工作尝试所暗示的
[a-z]*

TXR解决方案()

echo 'Song Name (f/ featured artist) (Remix)' | sed 's/\(.*\)(\(f\/[^)]\+\))/\1\2/'
样本运行:

$ txr paren.txr -
a b c d
[Ctrl-D]
a b c d

$ txr paren.txr -
The quick brown (f/ ox jumped over the (f/ lazy) dogs). (
The quick brown ox jumped over the (f/ lazy) dogs. (

这可能适合您:

echo "Song Name (f/ featuredartist) (Remix)" | sed 's|(\(f/[^)]*\))|\1|'
Song Name f/ featuredartist (Remix)

您需要与捕获组一起工作(不知道它们是否在sed中可用,请查找它们)。有什么进展吗?是这样吗?哇,关于(f/(/f嵌套的)featuredartist)。这属于“任何东西”。哪一个参数是结束参数?@kaz在这种情况下的输出将是“f/(/f nested)featuredartist”。如果要处理任意嵌套,则无法使用正则表达式解决问题。而不是使用正则表达式。但是,最近的一些工具中有一些“正则”表达式,实际上它们不是正则表达式。我想您正在尝试做一些类似于这里所解释的事情:但是,这一行无法去掉括号。@segfault,这一行有什么问题吗?它适用于示例当我在外壳中尝试时,您在响应中给出的行甚至不起作用
recur
变量是一个动态范围的hack。
text
pattern函数必须只能识别非嵌套大小写中的任意单个字符,否则它将吃掉一个右括号。在
paren
中,当
f/
出现在第一个递归级别时,我们使用嵌套级别仅去除括号。然而,不管怎样,我们都能识别出括号的嵌套。这使得Perl和PCRE中的递归模式看起来很简单。
recur
的重新绑定对于临时变量
level
来说非常笨拙。我刚刚引入了一个
rebind
指令,它一步完成这项工作:
@(rebind recur@(+1 recur))。表达式在以前的
recur`绑定可见的环境中求值,但随后将为recur建立一个新绑定,该绑定接受该值。现在是git版本,当然会在TXR 63中发布。显示代码吗?今晚不行,对我来说太晚了。但是这里有一个匹配函数调用名及其限定参数列表的可能递归嵌套的括号的简短示例:
/\w+(\(((?:[^()]+++;(?-1))*+\)/x
。此答案中的代码不只是匹配嵌套的括号。模式有动作。只需匹配嵌套括号就可以使用这样的模式函数来完成,例如
@(define paren)@(maybe)[@(coll)@(paren)@(until)]@(end)]@(end)@(end)@(end)@(end)
,这比一些串行线噪声更容易理解。(这来自平衡括号任务,它使用方括号:)。它将匹配像
[a[b c]d][e[]
这样的内容,并在输入中留下不匹配的后缀。如果你看到一个[,然后收集括号内的东西,直到你看到]。然后匹配匹配项。这样就可以了。谢谢您介意快速解释一下sed命令中的语法吗?我对正则表达式有一定的了解,但我希望了解\1在sed命令中的用法。有关说明(以及一个非常好的教程),请参阅。
echo "Song Name (f/ featuredartist) (Remix)" | sed 's|(\(f/[^)]*\))|\1|'
Song Name f/ featuredartist (Remix)