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?


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

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


9

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

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

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.


1
quand je cours que je /user90ne reçois pasuser90
Roboman1723

2
Non ça va, j'ai eu user90.
saptarshi nag


1

Cette simple commande grep fera le travail,

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

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

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.


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 .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.