我想从文件名中删除一些字符串。
我想删除括号中的每个字符串,但如果有字符串“remix”或“remix”或“remix”,则不删除
现在我有了sed "s/\s*\(\s?[A-z0-9. ]*\)//g"
但如何排除字符串中有混音的情况?
最佳答案
您可以使用捕获组:
sed 's/\(\s*([^)]*remix[^)]*)\)\|\s*(\s\?[a-z0-9. ]*)/\1/gi'
当“remix分支”不匹配时,捕获组未定义,匹配的部分将替换为空字符串。
当“remix分支”成功时,匹配的部分将被捕获组的内容替换,因此由它自己替换。
注意:如果这有助于避免误报,可以在“remix”周围添加单词边界:
\bremix\b
图案细节:
\( # open the capture group 1
\s* # zero or more white-spaces
( # a literal parenthesis
[^)]* # zero or more characters that are not a closing parenthesis
remix
[^)]*
)
\) # close the capture group 1
\| # OR
# something else between parenthesis
\s* # note that it is essential that the two branches are able to
# start at the same position. If you remove \s* in the first
# branch, the second branch will always win when there's a space
# before the opening parenthesis.
(\s\?[a-z0-9. ]*)
\1
是对捕获组1的引用i
使模式不区分大小写[编辑]
如果您想以一种与POSIX兼容的方式进行,那么必须使用不同的方法,因为有几个Gnu特性不可用,特别是alternation
\|
(还有i
修饰符、\s
字符类、可选量词)。另一种方法是查找所有不是左括号的最终字符,以及括号内包含“remix”的所有最终子字符串,后跟最终空格和括号间包含的最终子字符串。
如您所见,all是可选的,模式可以匹配空字符串,但这不是问题。
要删除的圆括号部分之前的所有内容都捕获在组1中。
sed 's/\(\([^(]*([^)]*[Rr][Ee][Mm][Ii][Xx][^)]*)[^ \t(]*\([ \t]\{1,\}[^ \t(]\{1,\}\)*\)*\)\([ \t]*([^)]*)\)\{0,1\}/\1/g;'
图案细节:
\( # open the capture group 1
\(
[^(]* # all that is not an opening parenthesis
# substring enclosed between parenthesis without "remix"
( [^)]* [Rr][Ee][Mm][Ii][Xx] [^)]* )
# Let's reach the next parenthesis without to match the white-spaces
# before it (otherwise the leading white-spaces are not removed)
[^ \t(]* # all that is not a white-space or an opening parenthesis
# eventual groups of white-spaces followed by characters that are
# not white-spaces nor opening parenthesis
\( [ \t]\{1,\} [^ \t(]\{1,\} \)*
\)*
\) # close the capture group 1
\(
[ \t]* # leading white-spaces
([^)]*) # parenthesis
\)\{0,1\} # makes this part optional (this avoid to remove a "remix" part
# alone at the end of the string)
此模式中的单词边界也不可用。因此,模仿它们的唯一方法是列出四种可能性:
([Rr][Ee][Mm][Ii][Xx]) # poss1
([Rr][Ee][Mm][Ii][Xx][^a-zA-Z][^)]*) # poss2
([^)]*[^a-zA-Z][Rr][Ee][Mm][Ii][Xx]) # poss3
([^)]*[^a-zA-Z][Rr][Ee][Mm][Ii][Xx][^a-zA-Z][^)]*) # poss4
并将
\?
替换为:\(poss1\)\{0,\}\(poss2\)\{0,\}\(poss3\)\{0,\}\(poss4\)\{0,\}