Hapus bagian pertama dari string menggunakan sed


14

Bagaimana saya dapatkan dari ini:

randomcollege-nt\user90

untuk ini:

user90

menggunakan sed?


2
Kiat yang membantu: ketika Anda tidak yakin apa yang dilakukan perintah, ketikkan man the_command_namedan Anda akan mendapatkan buku petunjuk yang bermanfaat untuk perintah tersebut. Anda juga dapat mengunjungi www.google.com dan mengetik "tutorial command_name" dan Anda akan menemukan banyak panduan langkah-demi-sisi.
DBedrenko

2
Untuk tutorial tentang sedkunjungan: grymoire.com/Unix/Sed.html
Pandya

Jawaban:


15

Saya akan menggunakan sederhana grepuntuk mencari user90:

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

Jika user90 tidak konstan, lebih suka perintah ini:

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

Akhirnya gunakan seduntuk mengedit file di tempat:

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

Atau untuk mencocokkan semua akun pengguna yang mungkin:

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

Lucunya saya mencobanya dan tidak ada yang kembali. Saya menggunakan 12,04 jika itu penting. Itu hanya muncul jika saya grep -Fseluruh string.
Roboman1723

@ Roboman1723 diuji pada 12,04, perintah pertama saya berfungsi. Pastikan Anda tidak memiliki alias grep yang ditentukan di suatu tempat. BTW karena sepertinya Anda sedang mencari pengganti inline dengan sed saya sudah menambahkan perintah tersebut.
Sylvain Pineau

Apakah ada cara Anda bisa membuat perintah sed memotong semua "randomcollege-nt \" tetapi menampilkan lebih dari sekadar pengguna 90? Contoh: randomcollege-nt \ user90 randomcollege-nt \ user91 randomcollege-nt \ user92 Output: user90 user91 user92
Roboman1723

1
@ Roboman1723 Anda harus melampirkan file asli Anda dan output yang Anda inginkan ke pertanyaan Anda sehingga semua orang bersedia membantu Anda dapat melihatnya.
Sylvain Pineau

1
@ SilvainPineau saya pikir perintah pertama bukan yang sesuai.
Avinash Raj

20

Anda menguraikan beberapa teks untuk mengekstrak nama pengguna dari sebuah domain\usernamestring, kemungkinan besar dari Windows. Sebagian besar jawaban di atas hanya menjawab string contoh spesifik Anda.

Cara terbaik untuk melakukan ini adalah menggunakan regex dalam sed untuk mengekstrak apa pun yang terjadi setelahnya \. Begini cara Anda melakukannya:

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

Itu akan cocok dengan semuanya ( .*) sampai garis miring terbalik (di sini, kita lolos, jadi begitu \\), lalu cocokkan semuanya setelah garis miring terbalik ( .*), tetapi menjadikannya grup penangkap (yaitu membungkus tanda kurung di sekitarnya, tetapi kita juga harus melarikan diri mereka, jadi \(.*\)). Sekarang kita memiliki apa pun yang muncul setelah \dalam string sebagai grup tangkap, kita mencetaknya dengan merujuknya \1.

Anda dapat menggunakan sedperintah di atas dengan nama domain apa saja, tidak harus 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

Saya tahu Anda ingin menggunakan sed, tapi saya akan menggunakan sesuatu yang berbeda ...

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

1
Mengetahui cara menggunakan alat sama pentingnya dengan mengetahui alat mana yang digunakan.
Rafał Cieślak

5

Apakah ini pertanyaannya?

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

jika status acak-nt tidak ada, gunakan perintah awk di atas / bawah.


1
ketika saya menjalankan itu saya /user90tidak mendapatkanuser90
Roboman1723

2
Tidak, tidak apa-apa, saya dapat user90.
saptarshi nag


1

Perintah grep sederhana ini akan melakukan pekerjaan,

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

1


Dengan sedmenghapus semua yang ada di string sebelum karakter tertentu (tentukan menjadi braket ganda [Spesifik char]).

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

Berarti mengganti semua ( .*[\]) karakter sebelum \char dengan karakter whitespace ( //)

Jika Anda memiliki file dan ingin menggantikan ganti gunakan -iflag in sedcommand seperti ini:

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

1

Pertanyaan aslinya diajukan sed, tetapi saya melihat bahwa alternatifnya populer di sini.

Jika Anda menggunakan Bash, ekspansi parameter adalah yang paling sederhana:

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

Jika Anda berpotensi mengharapkan lebih dari satu garis miring terbalik, gandakan tanda hash:

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

Untuk informasi lebih lanjut, man bashdan cari Parameter Expansion.


0

Jika ada orang yang mencoba untuk menghapus komentar # server_tokens off;dari nginx secara otomatis untuk membantu dengan auto dev-ops:

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

Diuji dan berfungsi untuk nginx / 1.12.1 di Ubuntu 16.04 LTS. Jawaban terkait untuk mengunci NGINX dengan mematikan token server di sini .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.