Entfernen Sie den ersten Teil einer Saite mit sed

14

Wie komme ich daraus:

randomcollege-nt\user90

dazu:

user90

benutzen sed?

Roboman1723
quelle
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
Sylvain Pineau
quelle
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
Alaa Ali
quelle
10

Ein anderer sed:

$ echo "randomcollege-nt\user90" | LC_ALL=C sed -e 's/.*\\//'
user90

oder POSIXly:

$ a='randomcollege-nt\user90'
$ printf '%s\n' "${a##*\\}"
user90
cuonglm
quelle
1
Es ist kein Bashismus, es ist eine POSIX- shFunktion. pubs.opengroup.org/onlinepubs/009604599/utilities/…
nyuszika7h
+1. Ihre Antwort wurde nicht gefunden, ich werde meinen Kommentar zu OP's entfernen ^^
Olivier Dulac
9

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

echo "randomcollege-nt\user90" | cut -d'\' -f2
kervin
quelle
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.

Archemar
quelle
1
wenn ich laufe , dass ich /user90nichtuser90
Roboman1723
2
Nein, das ist in Ordnung, ich habe user90.
Saptarshi Nag
3

Eher benutzt du 'awk' um "user90" zu filtern:

echo "randomcollege-nt\user90" | awk -F\\ {'print $2'}
saptarshi nag
quelle
Ist dies eine Möglichkeit für awk, die Datei zu bearbeiten und nicht in eine neue Datei auszugeben?
Roboman1723
@ Roboman1723 siehe stackoverflow.com/a/16531920/2072269
muru
Ja, Sie müssen die Option -f für awk verwenden. Einzelheiten finden Sie in der Manpage.
saptarshi nag
1

Dieser einfache grep Befehl erledigt die Arbeit,

$ echo 'randomcollege-nt\user90' | grep -oP '[^\\]*$'
user90
Avinash Raj
quelle
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
αғsнιη
quelle
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.

Paddy Landau
quelle
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 .

Jamescampbell
quelle