Comment puis-je tirer de ceci:
randomcollege-nt\user90
pour ça:
user90
en utilisant sed
?
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
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
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
Je sais que vous voulez utiliser sed, mais j'utiliserais quelque chose de différent ...
echo "randomcollege-nt\user90" | cut -d'\' -f2
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.
Vous utilisez plutôt 'awk' pour filtrer "user90":
echo "randomcollege-nt\user90" | awk -F\\ {'print $2'}
Avec sed
name__, 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 sed
comme ceci:
sed -i 's/.*[\]//' /path/to/FileName
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
.
Cette simple commande grep fera le travail,
$ echo 'randomcollege-nt\user90' | grep -oP '[^\\]*$'
user90
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 .