web-dev-qa-db-fra.com

Supprimer la première partie d'une chaîne en utilisant sed

Comment puis-je tirer de ceci:

randomcollege-nt\user90

pour ça:

user90

en utilisant sed?

14
Roboman1723

J'utiliserais un simple grep pour 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, utilisez sed pour éditer le fichier en place:

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

Ou pour correspondre à tous les comptes d'utilisateur possibles:

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

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

La meilleure façon de faire est d’utiliser regex dans sed pour extraire tout ce qui vient après \. Voici comment vous le feriez:

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

Cela correspond à tout (.*) jusqu’à une barre oblique inverse (ici, nous l’échappons; il s’agit donc de \\), puis à tout ce qui suit la barre oblique inverse (.*), mais nous en faisons un groupe de capture (c.-à-d. Nous entourons de crochets, doivent leur échapper, donc \(.*\)). Maintenant que nous avons ce qui vient après le \ 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 commande sed ci-dessus avec n’importe quel nom de domaine, mais 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
19
Alaa Ali

Un autre sed:

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

ou POSIXly:

$ a='randomcollege-nt\user90'
$ printf '%s\n' "${a##*\\}"
user90
10
cuonglm

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

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

Est-ce la question?

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

si le sting randomcollege-nt n'est pas contant, utilisez la commande awk ci-dessus/ci-dessous.

5
Archemar

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

echo "randomcollege-nt\user90" | awk -F\\ {'print $2'}
3
saptarshi nag


Avec sedname__, effacez tous les éléments d'une chaîne précédant un caractère spécifique (définissez-les entre crochets [Caractère spécifique]).

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

Cela 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 le remplacer, utilisez l'option -i dans la commande sedcomme ceci:

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

La question initiale demandait sed, mais je vois que les alternatives sont populaires ici.

Si vous utilisez Bash, le développement des paramètres est de loin le plus simple:

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

Si vous attendez potentiellement plus d'une barre oblique inversée, doublez les signes de hachage:

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

Pour plus d'informations, man bash et recherchez Parameter Expansion.

1
Paddy Landau

Cette simple commande grep fera le travail,

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

Si quelqu'un tente de supprimer automatiquement un commentaire # server_tokens off; de nginx afin de l'aider à utiliser auto dev-ops:

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

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

0
jamescampbell