Entfernen Sie den ersten Teil einer Saite mit sed


14

Wie komme ich daraus:

randomcollege-nt\user90

dazu:

user90

benutzen sed?


2
Ein hilfreicher Tipp: Wenn Sie nicht sicher sind, was ein Befehl bewirkt, geben man the_command_nameSie ihn ein und Sie erhalten eine hilfreiche Bedienungsanleitung für den Befehl. Sie können auch zu www.google.com gehen und "befehlsname tutorial" eingeben. Dort finden Sie zahlreiche schrittweise Anleitungen.
DBedrenko

2
Das Tutorial finden sedSie unter: grymoire.com/Unix/Sed.html
Pandya

Antworten:


15

Ich würde ein einfaches verwenden grep, um zu suchen user90:

$ echo "randomcollege-nt\user90" | grep -o user90
user90

Wenn user90 nicht konstant ist, bevorzugen Sie diesen Befehl:

$ echo "randomcollege-nt\user90" | grep -oP '(?<=randomcollege-nt\\)\w+'
user90

Zum Schluss benutzen Sie sed, um die Datei an Ort und Stelle zu bearbeiten:

$ sed -ri 's/randomcollege-nt\\(user[0-9]+)/\1/' my_file

Oder um alle möglichen Benutzerkonten abzugleichen:

$ sed -ri 's/randomcollege-nt\\(\w+)/\1/' my_file

Komischerweise habe ich das versucht und es ist nichts zurückgekehrt. Ich benutze 12.04, wenn das wichtig ist. Es zeigt sich nur, wenn ich grep -Fdie ganze Zeichenfolge.
Roboman1723

@ Roboman1723 am 12.04 getestet, meine ersten Befehle funktionieren. Stellen Sie sicher, dass Sie nicht irgendwo einen Grep-Alias ​​definiert haben. Übrigens, wie es scheint, suchen Sie nach Inline-Ersatz durch sed. Ich habe einen solchen Befehl hinzugefügt.
Sylvain Pineau

Gibt es eine Möglichkeit, diesen sed-Befehl dazu zu bringen, alle "randomcollege-nt \" auszuschneiden, aber mehr als nur Benutzer 90 anzuzeigen? Beispiel: randomcollege-nt \ user90 randomcollege-nt \ user91 randomcollege-nt \ user92 Ausgabe: user90 user91 user92
Roboman1723

1
@ Roboman1723 Sie sollten Ihre Originaldatei und die gewünschte Ausgabe an Ihre Frage anhängen, damit jeder, der Ihnen helfen möchte, sie sehen kann.
Sylvain Pineau

1
@ SylvainPineau Ich denke, der erste Befehl ist nicht angemessen.
Avinash Raj

19

Sie analysieren Text, um den Benutzernamen aus einer domain\usernameZeichenfolge zu extrahieren , wahrscheinlich aus Windows. Die meisten der obigen Antworten beziehen sich nur auf Ihre spezifische Beispielzeichenfolge.

Der beste Weg, dies zu tun, ist die Verwendung von Regex in sed, um das zu extrahieren, was danach kommt \. So würden Sie es machen:

sed 's|.*\\\(.*\)|\1|'

Das passt zu allem ( .*) bis zu einem Backslash (hier werden wir es maskieren, also ist es \\), dann passt es zu allem nach dem Backslash ( .*), macht es aber zu einer Erfassungsgruppe (dh, wir müssen Klammern um es wickeln, aber wir müssen auch maskieren) sie, so \(.*\)). Jetzt, da wir , was kommt nach dem \in der Zeichenfolge als Capture - Gruppe, wir drucken , indem sie sie mit der Referenzierung \1.

Sie können den obigen sedBefehl mit jedem Domain-Namen verwenden, nicht unbedingt randomcollege-nt.

$ echo "randomcollege-nt\user90" | sed 's|.*\\\(.*\)|\1|'
user90

$ echo "domain\username" | sed 's|.*\\\(.*\)|\1|'
username

$ echo "anydomainname\roboman1723" | sed 's|.*\\\(.*\)|\1|'
roboman1723


9

Ich weiß, dass Sie sed verwenden möchten, aber ich würde etwas anderes verwenden ...

echo "randomcollege-nt\user90" | cut -d'\' -f2

1
Zu wissen, wie man ein Werkzeug benutzt, ist genauso wichtig wie zu wissen, welches Werkzeug man benutzt.
Rafał Cieślak

5

Ist das die Frage?

$ echo randomcollege-nt\user90| sed -e s,randomcollege-nt\,,
user90

wenn das sting randomcollege-nt nicht kontaminiert ist, benutze das awk Kommando oben / unten.


1
wenn ich laufe , dass ich /user90nichtuser90
Roboman1723

2
Nein, das ist in Ordnung, ich habe user90.
Saptarshi Nag


1

Dieser einfache grep Befehl erledigt die Arbeit,

$ echo 'randomcollege-nt\user90' | grep -oP '[^\\]*$'
user90

1


Mit seddelete alles in einer Zeichenkette vor einem bestimmten Zeichen (in doppelter Klammer [Specific char] definieren).

echo "randomcollege-nt\user90" | sed 's/.*[\]//'

Bedeutet, dass alle ( .*[\]) Zeichen vor einem \Zeichen durch Leerzeichen ( //) ersetzt werden.

Wenn Sie eine Datei haben und ersetzen möchten, verwenden Sie das -iFlag in dem sedBefehl wie folgt :

sed -i 's/.*[\]//' /path/to/FileName

1

Die ursprüngliche Frage wurde gestellt sed, aber ich sehe, dass Alternativen hier beliebt sind.

Wenn Sie Bash verwenden, ist die Parametererweiterung bei weitem die einfachste:

ORIGIN='randomcollege-nt\user90'
echo "${ORIGIN#*\\}"

Wenn Sie möglicherweise mehr als einen Backslash erwarten, verdoppeln Sie die Hash-Zeichen:

echo "${ORIGIN##*\\}"

Für weitere Informationen man bashund suchen Sie nach Parameter Expansion.


0

Für den Fall, dass jemand versucht, ein auskommentiertes Element # server_tokens off;aus nginx automatisch zu entfernen , um bei automatischen Entwicklungsoperationen zu helfen:

sudo sed -ri 's/#\s(server_tokens off;)/\1/' /etc/nginx/nginx.conf.

Getestet und lauffähig für Nginx / 1.12.1 unter Ubuntu 16.04 LTS. Verwandte Antwort zum Sperren von NGINX durch Deaktivieren von Servertoken hier .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.