Wie kann man zwei Zeilen mit `sed` verketten?

748
sceddy

Ich versuche, zwei Zeilen der iwlistAusgabe zu verketten . Meine grepund sed-Befehle zum Entfernen von führenden und nachgestellten Leerzeichen funktionieren gut, aber ich kann nicht die letzte sedAnweisung erhalten, um das \nzu entfernen . Was vermisse ich?

sudo iwlist wlan0 scanning | grep -e ESSID -e Signal | sed -e 's/^[ \t]*//;s/[ \t]*$//' | sed -e 's/dBm\n/dBm /' 

Der Regex funktioniert gut vim.

2
Bitte werfen Sie einen Blick auf: [Was soll ich tun, wenn jemand meine Frage beantwortet?] (Http://superuser.com/help/someone-answers) Cyrus vor 5 Jahren 0

1 Antwort auf die Frage

2
Kamil Maciorowski

sedist ein Textwerkzeug. Standardmäßig gibt es eine Zeile Ausgabe pro Zeile Eingabe aus. Es ist zwar einfach, Zeilenumbrüche in die Ausgabe einzufügen (wodurch mehr Zeilen erzeugt werden), aber es ist nicht so einfach, Zeilenumbrüche von der Eingabe zu entfernen, da sie nicht wirklich zu den Zeilen gehören, die verarbeitet werden, sondern sie trennen.

Auszug aus info sed(Hervorhebung meines):

sedführt den folgenden Zyklus für jede Eingabezeile aus: Zuerst sedliest er eine Zeile aus dem Eingabestrom, entfernt alle nachgestellten Zeilenumbrüche und platziert sie im Musterbereich. Dann werden Befehle ausgeführt. […].

Es ist jedoch N:

N
Fügen Sie dem Musterbereich eine neue Zeile hinzu und hängen Sie dann die nächste Eingabezeile an den Musterbereich an. Wenn keine weiteren Eingaben vorhanden sind, wird der sedBefehl beendet, ohne weitere Befehle auszuführen.

Damit können Sie Linien paarweise bearbeiten, das ist es, was Sie brauchen. Fügen Sie Nin Ihrem letzten sedwie folgt hinzu :

sed -e 'N;s/dBm\n/dBm /' 

Beachten Sie, dass dies nur funktioniert, wenn die gesamte Eingabe logisch aus Zeilen besteht, die paarweise verarbeitet werden sollen, dh diese logische Struktur ist in Ordnung:

line 1 paired 1 line 2 paired 2 … 

während dieser ist nicht:

header line 1 paired 1 line 2 paired 2 … 

In diesem Fall sedwird headermit line 1, paired 1mit line 2usw. gegen Ihre Logik gepaart. Ein anderes schlechtes Beispiel:

line 1 paired 1 excessive line line 2 paired 2 … 

Das excessive linewird mit gepaart line 2. Dadurch wird die Logik aufeinander folgender Paare zerstört.

Also musst du vorsichtig sein. Wenn jedoch nur die Zeilen richtig gepaart sind, müssen Sie sich keine Gedanken darüber machen, welche Zeilenumbrüche Sie ersetzen, da Sie die Trennungspaare sowieso nicht ändern können. Aus diesem Grund ist das Einfügen dBmin Ihr Muster jetzt völlig überflüssig. Ihr letzter sedkann auch sein:

sed -e 'N;s/\n/ /' 

Wenn Sie eine komplexere Logik benötigen, lesen Sie diese Antwort . Es verwendet sedLinien nach ihrem Inhalt verketten.