Sed kullanarak dizenin ilk bölümünü kaldırma


14

Bundan nasıl alabilirim:

randomcollege-nt\user90

buna:

user90

kullanarak sed?


2
Yararlı bir ipucu: Bir komutun ne yaptığından emin değilseniz, yazın man the_command_nameve komut için yararlı bir kullanım kılavuzu alırsınız. Ayrıca www.google.com adresine gidip "komut_adı öğreticisi" yazabilirsiniz ve birçok adım adım kılavuz bulacaksınız.
— DBedrenko

2
sedZiyaret için eğitim için : grymoire.com/Unix/Sed.html
— Pandya

Yanıtlar:


15

Aramak için bir basit grepkullanırdım user90:

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

User90 sabit değilse bu komutu tercih edin:

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

Son olarak seddosyayı yerinde düzenlemek için kullanın:

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

Veya olası tüm kullanıcı hesaplarını eşleştirmek için:

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

Komik olan şey bunu denedim ve hiçbir şey geri dönmedi. Önemli olursa 12.04 kullanıyorum. Sadece ben grep -Fbütün dize eğer ortaya çıkıyor .
— Roboman1723

@ Roboman1723 12.04'te test edildi, ilk komutlarım çalışıyor. Bir yerde tanımlı bir grep takma adınız olmadığından emin olun. BTW, sed ile inline değiştirme arıyorsanız, böyle bir komut ekledim.
— Sylvain Pineau

Bu sed komutunun tüm "randomcollege-nt \" yi kesip sadece 90 kullanıcısından daha fazlasını göstermenin bir yolu var mı? Örnek: randomcollege-nt \ user90 randomcollege-nt \ user91 randomcollege-nt \ user92 Çıktı: user90 user91 user92
— Roboman1723 4:14

1
@ Roboman1723 Orijinal dosyanızı ve istediğiniz çıktıyı sorunuza eklemelisiniz, böylece size yardımcı olmak isteyen herkes görebilsin.
— Sylvain Pineau

1
@SylvainPineau ilk komutun uygun olmadığını düşünüyorum.
— Avinash Raj

20

domain\usernameBüyük olasılıkla Windows'tan bir dizeden kullanıcı adını ayıklamak için bir metin ayrıştırıyorsunuz . Yukarıdaki yanıtların çoğu yalnızca sizin örnek dizginize yöneliktir.

Bunu yapmanın en iyi yolu, sonra gelenleri ayıklamak için sed'de regex kullanmaktır \. Bunu nasıl yapacağınız aşağıda açıklanmıştır:

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

Bu, .*bir ters eğik çizgi (burada, kaçıyoruz, bu yüzden) kadar her şeyi ( ) \\eşleştirecek, sonra ters eğik çizgiden ( .*) sonra her şeyi eşleştirecek , ancak bir yakalama grubu haline getirecek (yani, köşeli parantezleri sarın, ama aynı zamanda kaçmalıyız) böylece \(.*\)). Artık \bir yakalama grubu olarak dizeden sonra gelen her şeye sahip olduğumuza göre, onu referans alarak yazdırıyoruz \1.

Yukarıdaki sedkomutu zorunlu olarak herhangi bir alan adıyla kullanabilirsiniz 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

Sed kullanmak istediğini biliyorum, ama farklı bir şey kullanırdım ...

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

1
Bilerek nasıl bir aracı kullanmak için bilerek kadar önemlidir ki kullanım aracı.
— Rafał Cieślak

5

Soru bu mu?

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

Eğer sting randomcollege-nt sabit değilse yukarıdaki / altındaki awk komutasını kullanın.


1
Ben almak çalıştırdığınızda /user90değiluser90
— Roboman1723

2
Hayır bu doğru, user90 aldım.
— saptarshi nag


1

Bu basit grep komutu işi yapacak,

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

1


İle sedbelirli bir karakterin önüne bir dizede silme şeyi (çift parantez [Özgül Char] içine tanımlamak).

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

Tümünü değiştir anlamına gelir (.*[\]Bir karakterden önce\ boşluk karakterlerini boşluk karakteri ( //) ile değiştirir

Eğer bir dosya var ve kullanmak yerine InPlace istiyorsanız -ibayrağı sedböyle komuta:

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

1

Sorulan orijinal soru sed , ancak burada alternatiflerin popüler olduğunu görüyorum.

Bash kullanıyorsanız, parametre genişletme açık ara en basit olanıdır:

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

Potansiyel olarak birden fazla ters eğik çizgi bekliyorsanız, karma işaretlerini iki katına çıkarın:

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

Daha fazla bilgi man bashiçin arama yapın Parameter Expansion.


0

# server_tokens off;Otomatik dev-op'lara yardımcı olması için herhangi bir yorumun nginx'ten otomatik olarak kaldırmaya çalışması durumunda :

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

Ubuntu 16.04 LTS'de nginx / 1.12.1 için test edildi ve çalışıyor. Burada sunucu belirteçlerini kapatarak NGINX'i kilitlemeyle ilgili yanıt .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.