it-swarm.com.de

gruppen erfassen in sed

Ich habe viele Zeilen des Formulars

ko04062 ko:CXCR3
ko04062 ko:CX3CR1
ko04062 ko:CCL3
ko04062 ko:CCL5
ko04080 ko:GZMA

und möchte gerne das ko: bit der rechten Spalte loswerden. Ich versuche, sed wie folgt zu verwenden:

echo "ko05414 ko:ITGA4" | sed 's/\(^ko\d{5}\)\tko:\(.*$\)/\1\2/'

die gibt einfach den ursprünglichen String aus, den ich echo'd. Kommandozeilen-Scripting, Sed, Pipes usw. sind sehr neu. Bitte seien Sie nicht zu wütend, wenn/wenn ich etwas extrem Dummes mache. 

Die Hauptsache, die mich verwirrt, ist, dass das Gleiche passiert, wenn ich das \1\2-Bit umkehre, um \2\1 zu lesen, oder nur eine Gruppe verwenden. Ich vermute, dies impliziert, dass mir etwas an der Mechanik fehlt, die Echoausgabe in sed zu leiten, oder dass mein Regex falsch ist oder dass ich sed falsch benutze oder dass sed die Ergebnisse der Substitution nicht druckt .

Jede Hilfe wäre sehr dankbar!

23
Mike Dewar

sed gibt seine Eingabe aus, weil die Substitution nicht übereinstimmt. Da Sie wahrscheinlich GNU sed verwenden, versuchen Sie Folgendes:

echo "ko05414     ko:ITGA4" | sed 's/\(^ko[0-9]\{5\}\)\tko:\(.*$\)/\1\2/'
  • \ d -> [0-9] da GNU sed\d nicht erkennt
  • {} ->\{\}, da GNU sed standardmäßig reguläre Standardausdrücke verwendet.
21
ninjalj

Das sollte es tun. Sie können auch die letzte Gruppe überspringen und stattdessen einfach \1 verwenden, aber da Sie Sed und Regex lernen, ist dies eine gute Sache. Ich wollte eine Nicht-Capturing-Gruppe in der Mitte verwenden, (:? ), aber ich konnte das nicht dazu bekommen, aus irgendeinem Grund mit Sed zu spielen, vielleicht wird es nicht unterstützt.

sed --posix 's/\(^ko[0-9]\{5\}\)\( ko:\)\(.*$\)/\1 \3/g' file > result

Und natürlich können Sie verwenden

sed --posix 's/ko://'
10
Anders

Sie brauchen nicht brauchen sed dafür

So geht's mit bash:

var="ko05414 ko:ITGA4"
echo ${var//"ko:"}

$ {var // "ko:"} ersetzt alle "ko:" durch ""

Siehe Manipulation von Strings für weitere Informationen

6
getekha

@OP, wenn du nur "ko:" loswerden willst, dann

$ cat file
ko04062 ko:CXCR3
ko04062 ko:CX3CR1
ko04062 ko:CCL3
ko04062 ko:CCL5
some text with a legit ko: this ko: will be deleted if you use gsub.
ko04080 ko:GZMA

$ awk '{sub("ko:","",$2)}1' file
ko04062 CXCR3
ko04062 CX3CR1
ko04062 CCL3
ko04062 CCL5
some text with a legit ko: this ko: will be deleted if you use gsub.
ko04080 GZMA

Schreibe eine Notiz. Sie können die reine Bash-Zeichenfolgenersetzung verwenden, ist jedoch nur effizienter, wenn Sie eine einzelne Zeichenfolge ändern. Wenn Sie über eine Datei verfügen, insbesondere über eine große Datei, ist die Verwendung von bash während der Leseschleife immer noch langsamer als mit sed oder awk.

0
ghostdog74