Hapus bagian pertama dari string menggunakan sed

14

Bagaimana saya dapatkan dari ini:

randomcollege-nt\user90

untuk ini:

user90

menggunakan sed?

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

Lainnya sed:

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

atau POSIXly:

$ a='randomcollege-nt\user90'
$ printf '%s\n' "${a##*\\}"
user90
cuonglm
sumber
1
Ini bukan bashism, ini shfitur POSIX . pubs.opengroup.org/onlinepubs/009604599/utilities/…
nyuszika7h
+1. tidak melihat jawaban Anda, saya akan menghapus komentar saya pada OP's ^^
Olivier Dulac
9

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

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

Archemar
sumber
1
ketika saya menjalankan itu saya /user90tidak mendapatkanuser90
Roboman1723
2
Tidak, tidak apa-apa, saya dapat user90.
saptarshi nag
3

Alih-alih Anda menggunakan 'awk' untuk memfilter "user90":

echo "randomcollege-nt\user90" | awk -F\\ {'print $2'}
saptarshi nag
sumber
Apakah ini cara awk untuk mengedit file pada tempatnya dan tidak harus meng-output-nya ke file baru?
Roboman1723
@ Roboman1723 lihat stackoverflow.com/a/16531920/2072269
muru
Ya, Anda harus menggunakan opsi -f untuk awk. Untuk detail lihat halaman manual.
saptarshi nag
1

Perintah grep sederhana ini akan melakukan pekerjaan,

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

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

jamescampbell
sumber