Remova a primeira parte de uma string usando sed

14

Como faço para obter isso:

randomcollege-nt\user90

para isso:

user90

usando sed?

Roboman1723
fonte
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
Sylvain Pineau
fonte
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
Alaa Ali
fonte
10

Outro sed:

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

ou POSIXly:

$ a='randomcollege-nt\user90'
$ printf '%s\n' "${a##*\\}"
user90
cuonglm
fonte
1
Não é um basismo, é um shrecurso POSIX . pubs.opengroup.org/onlinepubs/009604599/utilities/...
nyuszika7h
+1. não ver a sua resposta, eu vou retirar o meu comentário no OP de ^^
Olivier Dulac
9

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

echo "randomcollege-nt\user90" | cut -d'\' -f2
Kervin
fonte
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.

Archemar
fonte
1
quando eu corro que eu recebo /user90nãouser90
Roboman1723
2
Não, está tudo bem, eu tenho user90.
saptarshi nag
3

Em vez disso, você usa 'awk' para filtrar "user90":

echo "randomcollege-nt\user90" | awk -F\\ {'print $2'}
saptarshi nag
fonte
É uma maneira do awk editar o arquivo no local e não precisar enviá-lo para um novo arquivo?
precisa saber é o seguinte
@ Roboman1723 consulte stackoverflow.com/a/16531920/2072269
muru
Sim, você precisa usar a opção -f para ativar o awk.
saptarshi nag
1

Este comando grep simples fará o trabalho,

$ echo 'randomcollege-nt\user90' | grep -oP '[^\\]*$'
user90
Avinash Raj
fonte
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
αғsнιη
fonte
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.

Paddy Landau
fonte
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 .

jamescampbell
fonte