2016-05-22 2 views
0

einstimmt ich eine Textdatei wie diese:Sed: Konvertieren Sie nur auf XML-Tag, wenn Tag den ersten String

B1=text1 
B2=text2 
B3=text3 

Ich habe folgendes sed mit diesem Textformat konvertiert zwischen Tags in Text.

echo "String= Hello World" | sed 's#\([^=]\+\)=\(.*\)#<\1>\2</\1>#' 

Dieser sed gibt diese Ausgabe:

<String > Hello World</String > 

Wie das Tag setzen nur, wenn String beguns mit B und einer Zahl, zum Beispiel B45? so String B45

werden, wenn String übereinstimmt B + Anzahl

Dann Sed-Befehl diese Ausgabe zu erhalten (Beispiel)

<B1>text1</B1> 
<B2>text2</B2> 
<B3>text3</B3> 
+0

Es gibt keine Leerzeichen vor den Schließwinkel Klammern! –

+0

[bearbeiten] Sie Ihre Frage, um einfach eine Beispiel-Eingabedatei anzuzeigen, die beide Fälle enthält, die Sie tun und nicht konvertiert und die zugehörige Ausgabe möchten. –

Antwort

0

Ich denke, das wird für Sie arbeiten:

echo "String= Hllo World" | sed 's#\([^=]\+\)=\(\s*B[0-9]*.*\)#<\1>\2</\1>#' 
+0

Was hier passiert: ich hinzugefügt: \ s * - Spiel so viele Leerzeichen wie möglich B - Spiel Buchstaben B [0-9] * - Spiel so viele Zahlen wie möglich ich denke, es wird die Arbeit für Sie tun –

+0

aber es entfernt die Tags und die Bedingung wird immer noch nicht angewendet. – Abdel

+0

Was meinst du? Ihre Frage lautete: "Wie setze ich das Tag nur, wenn String mit B und einer Zahl begonnen hat?" Das ist die Antwort. Versuchen Sie, mehr Details zu geben, so werde ich versuchen, Hilfe –

0

Bitte verwenden Sie keinen regulären Ausdruck, um XML zu manipulieren. XML ist eine kontextabhängige Sprache. Regex ist nicht, so kann es nie richtig funktionieren. Im besten Fall hast du einen schmutzigen Hack, der eines Tages ohne erkennbaren Grund bricht, weil er Annahmen trifft, die nicht gültig sind.

Verwenden Sie bitte einen Parser. Es ist nicht schwer, aber Sie vermeiden spröde Codes.

Longhand in perl, es ist:

#!/usr/bin/env perl 
use strict; 
use warnings; 

use XML::Twig; 

my $input = "String= Hello World"; 
my ($tag, $content) = split /=/, $input; 

XML::Twig::Elt -> new ($tag, $content) -> print; 

Diese Ausgänge:

<String> Hello World</String> 

Als ausführlicheres Beispiel:

#!/usr/bin/env perl 
use strict; 
use warnings; 

use XML::Twig; 

my $input = ""; 
my ($tag, $content) = split /=/, $input; 

my $doc = XML::Twig->new(pretty_print => 'indented_a') ; 
$doc->set_xml_version("1.0"); 
$doc->set_encoding('utf-8'); 
$doc->set_root(XML::Twig::Elt->new('root')); 

while (<>) { 
    chomp; 
    my ($tag, $content) = split /=/; 
    if ($content =~ m/^B/) { 
     $doc->root->insert_new_elt('last_child', $tag, $content); 
    } 
} 

$doc->print; 

Eingabe von:

String= Hello World 
tag=B1234 some text here 
newtag=fish heads fish heads roly poly fish heads 
String=Better fun joy here 

Gibt ein Ergebnis von:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <String>Better fun joy here</String> 
    <tag>B1234 some text here</tag> 
</root> 

Es ist nicht allzu schwer, einen richtigen Parser zu verwenden, und wenn Sie mehr Grund brauchen, dies zu tun: RegEx match open tags except XHTML self-contained tags

+0

Vielen Dank für dieses Skript, wenn nicht möglich regex mit sed, I wird nach awk suchen. – Abdel

+0

'awk' kann XML aus den gleichen Gründen auch nicht sicher manipulieren. – Sobrique

Verwandte Themen