2012-03-24 16 views
3

Ich versuche sed (1) zu verwenden, um Klammern aus Zeichenfolgen zu entfernen, aber nur, wenn die Klammern mit einer bestimmten Zeichenfolge beginnen. Zum Beispiel möchte ich eine Zeichenfolge wie Song Name (f/ featured artist) (Remix) zu Song Name f/ featuredartist (Remix) ändern. Wie kann ich das erreichen?Verwenden von sed zum Entfernen von Klammern aus einer Zeichenfolge

Ich bin derzeit versucht, die folgenden:

echo "Song Name (f/ featuredartist) (Remix)" | sed s/"(f\/ [a-z]*)"/"f\/ "/ 

Aber all dies tut, ist Song Name f/ (Remix) zurück.

Beachten Sie auch: Alles geht zwischen f/ und ), nicht nur [a-z]*, wie mein Arbeitsversuch implizieren würde.

+0

Sie müssen sich mit Capture-Gruppen arbeiten (weiß nicht, ob sie in sed verfügbar sind, suchen sie oben). – SJuan76

+1

Geht alles? Ist das so? Wow über (f/(/ nested) featuredartist). Das fällt unter "alles". Welcher ist der letzte? – Kaz

+0

@kaz die Ausgabe in diesem Fall wäre "f/(/ f geschachtelt) featuredartist" – finiteloop

Antwort

4

Dies könnte für Sie arbeiten:

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

Das macht es. Vielen Dank! Würde es Ihnen etwas ausmachen, die Syntax im sed-Befehl schnell zu erklären? Ich habe allgemeines Wissen über reguläre Ausdrücke, hoffe aber, die Verwendung von \ 1 in sed-Befehlen zu verstehen. – finiteloop

+0

Siehe [hier] (http://www.grymoire.com/Unix/Sed.html#toc-uh-4) für eine Erklärung (und ein insgesamt gutes Tutorial). – potong

1
echo 'Song Name (f/ featured artist) (Remix)' | sed 's/\(.*\)(\(f\/[^)]\+\))/\1\2/' 
+0

Ich nehme an, dass Sie versuchen, etwas zu tun, was dem hier beschriebenen ähnlich ist: http://www.grymoire.com/Unix/Sed.html#uh-4, aber diese spezielle Zeile kann die Klammern nicht entfernen. – finiteloop

+0

@segfault, stimmt irgendetwas nicht mit diesem? Es funktioniert an dem Beispiel – perreal

+0

die Zeile, die Sie in der Antwort gab, funktionierte nicht einmal, wenn ich es in meiner Schale versuchte – finiteloop

0

TXR-Lösung (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) 
@[email protected] 
@(end) 

Probelauf:

$ 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. (
+0

Die 'recur' Variable ist ein dynamisch beschränkter Hack. Die 'texts'-Musterfunktion darf nur ein beliebiges einzelnes Zeichen im nicht verschachtelten Fall erkennen, ansonsten wird eine schließende Klammer gegessen. In 'paren' verwenden wir die Verschachtelungsebene, um nur die Klammern zu entfernen, wenn' f/'in der ersten Rekursionsebene auftritt. Wir erkennen jedoch die Verschachtelung von Klammern unabhängig voneinander. – Kaz

+0

Das macht rekursive Muster in Perl und PCRE einfach. – tchrist

+0

Zeige mir mit Code. – Kaz

Verwandte Themen