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.