Supprimer la première partie d'une chaîne à l'aide de sed

14

Comment puis-je en tirer:

randomcollege-nt\user90

pour ça:

user90

en utilisant sed?

Roboman1723
la source
2
Un conseil utile: lorsque vous n'êtes pas sûr de ce que fait une commande, tapez man the_command_nameet vous obtiendrez un manuel d'instructions utile pour la commande. Vous pouvez également aller sur www.google.com et taper "didacticiel command_name" et vous trouverez de nombreux guides pas à pas.
DBedrenko
2
Pour un didacticiel sur la sedvisite: grymoire.com/Unix/Sed.html
Pandya

Réponses:

15

J'utiliserais un simple grepà rechercher user90:

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

Si user90 n'est pas constant, préférez cette commande:

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

Enfin en utilisant sedpour éditer le fichier en place:

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

Ou pour faire correspondre tous les comptes d'utilisateurs possibles:

$ sed -ri 's/randomcollege-nt\\(\w+)/\1/' my_file
Sylvain Pineau
la source
Le plus drôle, c'est que j'ai essayé ça et que rien n'est revenu. J'utilise 12.04 si cela compte. Il n'apparaît que si je grep -Fla chaîne entière.
Roboman1723
@ Roboman1723 testé le 12.04, ma première commande fonctionne. Assurez-vous que vous n'avez pas défini d'alias grep quelque part. BTW car il semble que vous recherchiez un remplacement en ligne avec sed, j'ai ajouté une telle commande.
Sylvain Pineau
Existe-t-il un moyen de faire en sorte que cette commande sed supprime tous les "randomcollege-nt \" mais affiche plus que l'utilisateur 90? Exemple: randomcollege-nt \ user90 randomcollege-nt \ user91 randomcollege-nt \ user92 Sortie: user90 user91 user92
Roboman1723
1
@ Roboman1723 Vous devez joindre votre fichier d'origine et la sortie souhaitée à votre question afin que tous ceux qui souhaitent vous aider puissent le voir.
Sylvain Pineau
1
@SylvainPineau je pense que la première commande n'est pas appropriée.
Avinash Raj
20

Vous analysez du texte pour extraire le nom d'utilisateur d'une domain\usernamechaîne, très probablement à partir de Windows. La plupart des réponses ci-dessus ne concernent que votre exemple de chaîne spécifique.

La meilleure façon de procéder consiste à utiliser l'expression régulière dans sed pour extraire tout ce qui vient après \. Voici comment procéder:

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

Cela correspondra à tout ( .*) jusqu'à une barre oblique inverse (ici, nous y échappons, c'est donc \\), puis à tout ce qui suit après la barre oblique inverse ( .*), mais en en faisant un groupe de capture (c.-à-d. Entourer les crochets autour, mais nous devons également nous échapper eux, donc \(.*\)). Maintenant que nous avons tout ce qui vient après \dans la chaîne en tant que groupe de capture, nous l'imprimons en le référençant avec \1.

Vous pouvez utiliser la sedcommande ci-dessus avec n'importe quel nom de domaine, pas nécessairement 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
la source
10

Un autre sed:

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

ou POSIX:

$ a='randomcollege-nt\user90'
$ printf '%s\n' "${a##*\\}"
user90
cuonglm
la source
1
Ce n'est pas un bashisme, c'est une shfonctionnalité POSIX . pubs.opengroup.org/onlinepubs/009604599/utilities/…
nyuszika7h
+1. n'a pas vu votre réponse, je vais supprimer mon commentaire sur les OP ^^
Olivier Dulac
9

Je sais que tu veux utiliser sed, mais j'utiliserais quelque chose de différent ...

echo "randomcollege-nt\user90" | cut -d'\' -f2
kervin
la source
1
Sachant comment utiliser un outil est tout aussi important que de savoir qui outil à utiliser.
Rafał Cieślak
5

Est-ce là la question?

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

si la piqûre randomcollege-nt n'est pas contante, utilisez la commande awk ci-dessus / ci-dessous.

Archemar
la source
1
quand je cours que je /user90ne reçois pasuser90
Roboman1723
2
Non ça va, j'ai eu user90.
saptarshi nag
3

Vous utilisez plutôt 'awk' pour filtrer "user90":

echo "randomcollege-nt\user90" | awk -F\\ {'print $2'}
saptarshi nag
la source
Est-ce un moyen avec awk de modifier le fichier en place et de ne pas avoir à le sortir dans un nouveau fichier?
Roboman1723
@ Roboman1723 voir stackoverflow.com/a/16531920/2072269
muru
Oui, vous devez utiliser l'option -f pour awk.Pour plus de détails, voir la page de manuel.
saptarshi nag
1

Cette simple commande grep fera le travail,

$ echo 'randomcollege-nt\user90' | grep -oP '[^\\]*$'
user90
Avinash Raj
la source
1


Avec sedtout supprimer dans une chaîne avant un caractère spécifique (définir entre crochets [Caractère spécifique]).

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

Signifie remplacer tous les caractères ( .*[\]) avant un caractère par un \caractère d'espacement ( //)

Si vous avez un fichier et que vous souhaitez remplacer la commande use -iflag in sedcomme ceci:

sed -i 's/.*[\]//' /path/to/FileName
αғsнιη
la source
1

La question initiale demandée sed, mais je vois que les alternatives sont populaires ici.

Si vous utilisez Bash, l'expansion des paramètres est de loin la plus simple:

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

Si vous vous attendez à plus d'une barre oblique inverse, doublez les signes de hachage:

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

Pour plus d'informations man bashet recherchez Parameter Expansion.

Paddy Landau
la source
0

Dans le cas où quelqu'un essaie de supprimer # server_tokens off;automatiquement un commentaire de nginx pour aider avec les opérations de développement automatique:

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

Testé et fonctionne pour nginx / 1.12.1 sur Ubuntu 16.04 LTS. Réponse connexe au verrouillage de NGINX en désactivant les jetons de serveur ici .

jamescampbell
la source