6 Stimmen

Wie kann ich zwei Zeilen mit sed vertauschen?

Weiß jemand, wie man die line a avec line b y line b avec line a in einer Textdatei mit dem sed-Editor?

Ich kann sehen, wie man eine Zeile im Musterbereich durch eine Zeile im Haltebereich ersetzt (d.h., /^Paco/x o /^Paco/g ), aber was ist, wenn ich die Zeile nehmen will, die mit Paco und ersetzen Sie sie durch die Zeile, die mit Vinh und nehmen Sie auch die Zeile, die mit Vinh und ersetzen Sie sie durch die Zeile, die mit Paco ?

Nehmen wir zunächst einmal an, es gäbe eine Zeile mit Paco und eine Zeile mit Vinh und dass die Linie Paco erfolgt vor der Zeile Vinh . Dann können wir zum allgemeinen Fall übergehen.

4voto

smilingthax Punkte 4894
#!/bin/sed -f
/^Paco/ {
:notdone
  N
  s/^\(Paco[^\n]*\)\(\n\([^\n]*\n\)*\)\(Vinh[^\n]*\)$/\4\2\1/
  t
  bnotdone
}

Nach dem Abgleich mit /^Paco/ lesen wir in den Musterpuffer, bis s// erfolgreich ist (oder EOF: der Musterpuffer wird unverändert ausgegeben). Dann beginnen wir erneut mit der Suche nach /^Paco/.

4voto

vbuterin Punkte 31
cat input | tr '\n' 'ç' | sed 's/\(ç__firstline__\)\(ç__secondline__\)/\2\1/g' | tr 'ç' '\n' > output

Ersetzen Sie __firstline__ y __secondline__ mit Ihren gewünschten Regexps. Stellen Sie sicher, dass Sie alle Instanzen von . in Ihrer Regexp mit [^ç] . Wenn Ihr Text tatsächlich eine ç enthält, durch etwas anderes ersetzen, das in Ihrem Text nicht vorkommt.

2voto

ghostdog74 Punkte 305138

Versuchen Sie dieses awk-Skript.

s1="$1"
s2="$2"
awk -vs1="$s1" -vs2="$s2" '
{ a[++d]=$0 }
$0~s1{ h=$0;ind=d}
$0~s2{
 a[ind]=$0
 for(i=1;i<d;i++ ){ print a[i]}
 print h
 delete a;d=0;
}
END{ for(i=1;i<=d;i++ ){ print a[i] } }' file

Ausgabe

$ cat file
1
2
3
4
5

$ bash test.sh 2 3
1
3
2
4
5

$ bash test.sh 1 4
4
2
3
1
5

使用方法 sed (oder gar nicht) für eine einfache Ersetzung. Für alles, was komplizierter ist, verwenden Sie eine Programmiersprache

0voto

smilingthax Punkte 4894

Ein einfaches Beispiel aus der GNU sed texinfo Dokumentation:

Note that on implementations other than GNU `sed' this script might
easily overflow internal buffers.

 #!/usr/bin/sed -nf

 # reverse all lines of input, i.e. first line became last, ...

 # from the second line, the buffer (which contains all previous lines)
 # is *appended* to current line, so, the order will be reversed
 1! G

 # on the last line we're done -- print everything
 $ p

 # store everything on the buffer again
 h

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X