[英]Using sed to strip parentheses from a string
I am trying to use sed (1) to remove parentheses from strings, but only when the parentheses begin with a particular string. 我试图使用sed (1)从字符串中删除括号,但仅当括号以特定字符串开头时。 For example, I want to change a string such as
Song Name (f/ featured artist) (Remix)
, to Song Name f/ featuredartist (Remix)
. 例如,我想将
Song Name (f/ featured artist) (Remix)
等字符串更改为Song Name f/ featuredartist (Remix)
。 How can I achieve this? 我怎样才能做到这一点?
I am currently trying the following: 我目前正在尝试以下方法:
echo "Song Name (f/ featuredartist) (Remix)" | sed s/"(f\/ [a-z]*)"/"f\/ "/
But all this does is return Song Name f/ (Remix)
. 但所有这一切都是返回
Song Name f/ (Remix)
。
Also note: Anything goes between f/
and )
, not just [az]*
as my working attempt would imply. 另外请注意:任何东西都之间
f/
和)
,而不仅仅是[az]*
作为我工作的尝试将意味着。
This might work for you: 这可能对你有用:
echo "Song Name (f/ featuredartist) (Remix)" | sed 's|(\(f/[^)]*\))|\1|'
Song Name f/ featuredartist (Remix)
echo 'Song Name (f/ featured artist) (Remix)' | sed 's/\(.*\)(\(f\/[^)]\+\))/\1\2/'
TXR solution ( http://www.nongnu.org/txr ). TXR解决方案( http://www.nongnu.org/txr )。
@;; a texts is a collection of text pieces
@;; with no gaps in between.
@;;
@(define texts (out))@\
@(coll :gap 0)@(textpiece out)@(end)@\
@(cat out "")@\
@(end)
@;;
@;; recursion depth indicator
@;;
@(bind recur 0)
@;;
@;; a textpiece is a paren unit,
@;; or a sequence of chars other than parens.
@;; or, else, in the non-recursive case only,
@;; any character.
@;;
@(define textpiece (out))@\
@(cases)@\
@(paren out)@\
@(or)@\
@{out /[^()]+/}@\
@(or)@\
@(bind recur 0)@\
@{out /./}@\
@(end)@\
@(end)
@;;
@;; a paren unit consists
@;; of ( followed by a space-delimited token
@;; followed by some texts (in recursive mode)
@;; followed by a closing paren ).
@;; Based on what the word is, we transform
@;; the text.
@;;
@(define paren (out))@\
@(local word inner level)@\
@(bind level recur)@\
@(local recur)@\
@(bind recur @(+ level 1))@\
(@word @(texts inner))@\
@(cases)@\
@(bind recur 1)@\
@(bind word ("f/") ;; extend list here
)@\
@(bind out inner)@\
@(or)@\
@(bind out `(@word @inner)`)@\
@(end)@\
@(end)
@;; scan standard input in freeform (as one big line)
@(freeform)
@(texts out)@trailjunk
@(output)
@out@trailjunk
@(end)
Sample run: 样品运行:
$ 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. (
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.