
Ich habe eine Datei namens a.txt. Und sie enthält den folgenden Inhalt. Es ist nicht bekannt, wie viele Zeilen zwischen den einzelnen Funktionen liegen.
function a(
line 1;
line 2;
line ...;
properties pro = "test";
)
function b(
line 1;
line 2;
line ...;
properties pro= "test";
)
function c(
properties pro= "test";
)
Ich möchte bearbeiten
function b(
line 1;
line 2;
line ...;
properties pro= "test";
)
Zu dem Folgendem
function b(
line 1;
line 2;
line ...;
properties pro= "replace";
)
Ist es möglich, einzeilige Befehle wie sed oder awk zu verwenden?
Antwort1
Vorausgesetzt, Ihre Funktionen sind wie gezeigt durch eine oder mehrere Leerzeilen in Absätze unterteilt, können Sie awk mit einem leeren Datensatztrennzeichen verwenden. Insbesondere mit GNU awk:
$ gawk '
BEGIN{RS=""}
/^function b/ {sub(/properties pro= "test"/,"properties pro= \"replace\"")}
{printf "%s%s", $0, RT}
' a.txt
function a(
line 1;
line 2;
line ...;
properties pro = "test";
)
function b(
line 1;
line 2;
line ...;
properties pro= "replace";
)
function c(
properties pro= "test";
)
Sie können auch nicht-GNU-awk verwenden, müssen dann aber einen festen Ausgabedatensatztrenner festlegen, ORS
da der RT
Trenner GNU-spezifisch ist.
Perl stellt über die Option einen ähnlichen Absatzmodus bereit -00
.
Mit sed können Sie einen Adressbereich mit regulären Ausdrücken verwenden, um den Umfang der Ersetzung einzuschränken, z. B.
$ sed '/^function b/,/^)$/s/properties pro= "test"/properties pro= "replace"/' a.txt
function a(
line 1;
line 2;
line ...;
properties pro = "test";
)
function b(
line 1;
line 2;
line ...;
properties pro= "replace";
)
function c(
properties pro= "test";
)
Bedenken Sie jedoch, dass Dinge, die in Ihrer "Sprache" syntaktisch neutral sein können (wie z. B. LeerzeileninnerhalbEine Funktion) kann diesen Ansatz unterbrechen – aus diesem Grund sind reguläre Ausdrücke für solche Aufgaben oft keine gute Wahl.