Ist es möglich, es in einem Liner zu tun?
Ich habe eine Ausgabe wie diese:
"First line" - Description
" Second line" - Description
"Third line" - Description
" Fourth line" - Description
Diese Eingabe wird automatisch generiert.
Ich möchte das erste Vorkommen von "
(Anführungszeichen + Leerzeichen) durch "
(Anführungszeichen) für jede Zeile ersetzen . Wenn ich die Substitution global anwende, ändert sich auch jedes Vorkommen von line" -
bis line"-
. Daher habe ich mich gefragt, ob es möglich ist, einen sed one-Liner zu verwenden, um dies zu erreichen.
Ich habe versucht, ^
so zu verwenden
sed -r ':a;N;$!ba;s/(\^\" )/\"/g'
Aber es funktioniert nicht, es ersetzt nichts. Ich habe es versucht
sed -r ':a;N;$!ba;s/(^|\" )/\"/g'
und es ersetzt alle Vorkommen. Ich habe gerade angefangen, sed zu verwenden, daher weiß ich nicht wirklich, ob ich etwas falsch mache.
Was fehlt mir hier?
sed
regular-expression
Steve B.
quelle
quelle
sed
, aber um die Portabilität zu gewährleisten und wirklich seltsame Fehler zu vermeiden, sollten Sie ein bestimmtes Befehlsargument nach einer Beschriftung beenden (falls Sie sie überhaupt benötigen). ZBsed -e ':a' -e 'N;$!ba' -e 'whatever'
Antworten:
Du überdenkst es.
sed
Ersetzt standardmäßig nur die erste Instanz in einer Zeile (ohne den/g
Modifikator), obwohl Sie immer noch verankern möchten, weil Sie nicht so sehr die erste Instanz in der Zeile als die am Anfang der Zeile möchten. und normalerweise benötigen Sie nicht die expliziten Zeilenaktionen, die Sie verwenden möchten (warum?).quelle
sed
Befehle wieN
und Beschriftungen wie:a
sind überhaupt nicht veraltet und sie sind portabel und POSIX-spezifiziert , im Gegensatz zu Perl / Python / Ruby / was auch immer. Es ist jedoch wahr, dass Sie lernen sollten , wenn Sie feststellen, dass Sie sie häufig brauchen .awk
Eine allgemeinere Antwort, da ich die Antwort von Geekosaur nicht kommentieren kann - Sie würden das ^ (Ankeranfang) nicht setzen. Wenn Sie beispielsweise das erste Vorkommen von A durch B ersetzen möchten, haben Sie
quelle