Ich habe die folgende Zeichenfolge. Ich möchte das erste Vorkommen von Ziffern in einer Zeile finden. Verwenden Sie diese Übereinstimmung, um die NULL-Werte zu ersetzen.

INSERT INTO data VALUES (11,1), (NULL,2), (NULL,3), (NULL,4);

Ich bin wirklich überhaupt nicht mit sed oder awk vertraut.

Im obigen Beispiel ist dies also die Ausgabe, die ich möchte.

INSERT INTO data VALUES (11,1), (11,2), (11,3), (11,4);

Dies ist ein bisschen pseudo des Problems, ich denke awk '{sub (/ {digit} /, "NULL", capturegroup}'

while read -r line; do
    name="$line"
    echo $line  |  
    awk '
    match($0,/\([0-9]+/){
      value=substr($0,RSTART+1,RLENGTH-1)
    }
    {
      gsub("NULL",value)
    }
    1' >> converted.sql
done < test.sql
-1
muscleman71 18 Jän. 2019 im 17:31

3 Antworten

Beste Antwort

Mit sed (getestet auf GNU sed 4.2.2 variiert die Syntax für verschiedene Implementierungen)

$ cat ip.txt
INSERT INTO data VALUES (11,1), (NULL,2), (NULL,3), (NULL,4);
foo (42,14), (4,NULL), (5,3), (NULL,14)

$ sed -E ':a s/([0-9]+)(.*)NULL/\1\2\1/; ta' ip.txt
INSERT INTO data VALUES (11,1), (11,2), (11,3), (11,4);
foo (42,14), (4,42), (5,3), (42,14)
  • -E, um ERE anstelle von Standard-BRE zu verwenden
  • :a label a
  • ([0-9]+)(.*)NULL erste Ziffernfolge, gefolgt von anderem Text, gefolgt vom letzten Auftreten von NULL in der Zeile
  • \1\2\1 gemäß erwarteter Ausgabe
  • ta Verzweigung zur Bezeichnung a, wenn die Ersetzung erfolgreich war
  • Siehe Sed In-Place-Bearbeitung wenn Sie die Eingabedatei selbst ändern müssen
2
Sundeep 18 Jän. 2019 im 15:12

Könnten Sie bitte folgendes versuchen.

echo "INSERT INTO data VALUES (11,1), (NULL,2), (NULL,3), (NULL,4);"  |  
awk '
match($0,/\([0-9]+/){
  value=substr($0,RSTART+1,RLENGTH-1)
}
{
  gsub("NULL",value)
}
1'

Die Ausgabe erfolgt wie folgt.

INSERT INTO data VALUES (11,1), (11,2), (11,3), (11,4);

Wenn Sie diesen Vorgang für eine Eingabedatei ausführen möchten, gehen Sie gemäß dem Kommentar des OP wie folgt vor (übergeben Sie einfach den Namen der Eingabedatei an das Skript awk).

awk '
match($0,/\([0-9]+/){
  value=substr($0,RSTART+1,RLENGTH-1)
}
{
  gsub("NULL",value)
}
1' Input_file
1
RavinderSingh13 18 Jän. 2019 im 14:56

Sie können auch Perl ausprobieren

$ cat muscleman.txt
INSERT INTO data VALUES (11,1), (NULL,2), (NULL,3), (NULL,4);
INSERT INTO data VALUES (22,1), (NULL,2), (NULL,3), (NULL,4);
INSERT INTO data VALUES (33,1), (NULL,2), (NULL,3), (NULL,4);
$  perl -pe ' /(\d+)/ and $x=$1; s/NULL/$x/g ' muscleman.txt
INSERT INTO data VALUES (11,1), (11,2), (11,3), (11,4);
INSERT INTO data VALUES (22,1), (22,2), (22,3), (22,4);
INSERT INTO data VALUES (33,1), (33,2), (33,3), (33,4);
$

Danke @Sundeep für eine weitere kürzere Antwort!

$ perl -pe '($x)=/(\d+)/; s/NULL/$x/g' muscleman.txt
INSERT INTO data VALUES (11,1), (11,2), (11,3), (11,4);
INSERT INTO data VALUES (22,1), (22,2), (22,3), (22,4);
INSERT INTO data VALUES (33,1), (33,2), (33,3), (33,4);
$
1
stack0114106 18 Jän. 2019 im 15:33