Remova a primeira parte de uma string usando sed


14

Como faço para obter isso:

randomcollege-nt\user90

para isso:

user90

usando sed?


2
Uma dica útil: quando você não tiver certeza do que um comando faz, digite man the_command_namee você receberá um manual de instruções útil para o comando. Você também pode ir para www.google.com e digitar "command_name tutorial" e encontrará vários guias passo a passo.
DBedrenko 5/09

2
Para obter tutorial sobre a sedvisita: grymoire.com/Unix/Sed.html
Pandya

Respostas:


15

Eu usaria um simples greppara procurar user90:

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

Se user90 não for constante, prefira este comando:

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

Finalmente, use sedpara editar o arquivo no local:

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

Ou para corresponder a todas as contas de usuário possíveis:

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

O engraçado é que tentei isso e nada retornou. Estou usando o 12.04, se isso importa. Só aparece se eu tiver grep -Fa string inteira.
precisa saber é o seguinte

@ Roboman1723 testado em 12.04, meus primeiros comandos funcionam. Certifique-se de não ter um alias grep definido em algum lugar. BTW, como parece que você está procurando a substituição em linha com sed eu adicionei esse comando.
21413 Sylvain Pineau

Existe uma maneira de você fazer esse comando sed cortar todos os "randomcollege-nt \", mas exibir mais do que apenas o usuário 90? Exemplo: randomcollege-nt \ user90 randomcollege-nt \ user91 randomcollege-nt \ user92 Saída: user90 user91 user92
Roboman1723 4/14

1
@ Roboman1723 Você deve anexar seu arquivo original e a saída desejada à sua pergunta, para que todos que estejam dispostos a ajudá-lo possam vê-lo.
Sylvain Pineau 4/04

1
@SylvainPineau eu acho que o primeiro comando não é apropriado.
Avinash Raj

19

Você está analisando algum texto para extrair o nome de usuário de uma domain\usernamestring, provavelmente do Windows. A maioria das respostas acima trata apenas da sua sequência de exemplo específica.

A melhor maneira de fazer isso é usar o regex no sed para extrair o que vier depois \. Aqui está como você faria isso:

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

Isso corresponderá a tudo ( .*) até uma barra invertida (aqui, estamos escapando, por isso é \\), depois corresponderá a tudo após a barra invertida ( .*), mas transformando-o em um grupo de captura (ou seja, entre colchetes, mas também precisaremos escapar) eles, então \(.*\)). Agora que temos o que vem depois da \string como um grupo de captura, imprimimos fazendo referência a ele \1.

Você pode usar o sedcomando acima com qualquer nome de domínio, não necessariamente 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

Eu sei que você quer usar o sed, mas eu usaria algo diferente ...

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

1
Sabendo como usar uma ferramenta é tão importante quanto saber que ferramenta para uso.
Rafał Cieślak

5

Essa é a pergunta?

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

se o sting randomcollege-nt não for contant, use o comando awk acima / abaixo.


1
quando eu corro que eu recebo /user90nãouser90
Roboman1723

2
Não, está tudo bem, eu tenho user90.
saptarshi nag


1

Este comando grep simples fará o trabalho,

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

1


Com sedexcluir tudo em uma sequência antes de um caractere específico (defina entre colchetes [Caractere específico]).

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

Significa substituir todos os .*[\]caracteres ( ) antes de um \caractere por caracteres de espaço em branco ( //)

Se você possui um arquivo e deseja substituir, use -iflag flag no sedcomando como este:

sed -i 's/.*[\]//' /path/to/FileName

1

A pergunta original foi solicitada sed, mas vejo que as alternativas são populares aqui.

Se você estiver usando o Bash, a expansão de parâmetros é de longe a mais simples:

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

Se você está potencialmente esperando mais de uma barra invertida, duplique os sinais de hash:

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

Para mais informações, man bashprocure Parameter Expansion.


0

Caso alguém esteja tentando remover um comentário # server_tokens off;do nginx automaticamente para ajudar nas dev-ops automáticas:

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

Testado e funcionando para o nginx / 1.12.1 no Ubuntu 16.04 LTS. Resposta relacionada ao bloqueio do NGINX desativando os tokens do servidor aqui .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.