2017-07-26 3 views
2

Ich habe Datei settings.inc.php mit folgendem Inhalt:sed: Wie nur erste Vorkommen von Wert extrahieren

<?php 
define('_DB_SERVER_', 'mariadb'); 
define('_DB_NAME_', 'organic'); 
define('_DB_USER_', 'prestashop'); 
define('_DB_PASSWD_', 'prestashop'); 

ich diese Werte bash extrahieren möchten, so konnte ich den folgenden Befehl erstellen:

sed -rn 's/^.*_DB_NAME_'\'', '\''(\w+)'\''\);/\1/p' settings.inc.php 

Dies wird organic, so wie es sollte, aber ich möchte es weiter verbessern. Sagen wir, wir würden diese Art von Datei haben:

<?php 
define('_DB_SERVER_', 'mariadb'); 
define('_DB_NAME_', 'organic1'); 
define('_DB_NAME_', 'organic2'); 
define('_DB_USER_', 'prestashop'); 
define('_DB_PASSWD_', 'prestashop'); 

obigen Befehl verwenden auf dieser Datei würden wir bekommen:

organic1 
organic2 

Die Sache ist die: Ich möchte für diesen Befehl immer nur einen Wert zurückgeben, also lasst uns das erste sagen. Kann ich das erreichen, ohne das Ergebnis in den zweiten Befehl zu leiten?

Antwort

0

Wenn Sie konvertieren Sie Ihre Ersatz-Befehl durch Druck auf einen Befehlsblock, gefolgt nur auf Linien adressiert durch Muster Betrieb (mit) _DB_NAME_, können Sie nach dem ersten Spiel/print beenden:

$ sed -rn "/_DB_NAME_/ { s/.*'(\w+)'\);$/\1/p;q }" settings.inc.php 
organic1 

Notiere die q Befehl nach .

Auch Ihr sed Skript kann durch Verwendung von doppelten Anführungszeichen und Verankerung am Ende vereinfacht werden.

0

Rohr Ihre sed Befehl head und die erste Zeile wie unten gezeigt auswählen:

sed -rn 's/^.*_DB_NAME_'\'', '\''(\w+)'\''\);/\1/p' settings.inc.php | head -1 
1

Mit GNU grep Sie könnte es tun:

grep -m1 -Po "_DB_NAME_', '\K[^']+" settings.inc.php 

Die grep Argumente sind:

  • -m 1: stoppt die Suche nach 1 Übereinstimmung
  • -P: schaltet Perl-Stil regex (so können wir \K hier verwenden)
  • -o: nur den Teil der Zeile drucken, das dem Muster entspricht

Der \K Teil des Musters sagt nicht enthalten alles bis zu diesem Punkt als Teil des Spiels, haben wir dann den Rest des Musters alles finden, das ist kein '.

Wenn Sie mit sed kleben wollten Sie die _DB_NAME_ Linie finden konnte, beenden Sie, nachdem Sie es gefunden:

sed -rn '/_DB_NAME/ {s/^.*_DB_NAME_'\'', '\''(\w+)'\''\);/\1/;p;q}' settings.inc.php 

die _DB_NAME_ Spiele geht dann in den Block, dass Ihr s ubstitution tut, p die Linie Rints , dann q UITS

2

auch awk

$ awk -F "'" '$2=="_DB_NAME_"{print $4; exit}' settings.inc.php 
organic1 
verwenden können
  • -F "'" Verwendung Hochkommata als Eingabefeldtrenn
  • $2=="_DB_NAME_" Prüfen, ob zweite Feld ist _DB_NAME_
  • print $4 wenn die Bedingung erfüllt, 4. Druckfeld
  • exit als nur erste Spiel benötigt wird
Verwandte Themen