Bir desene kadar her şeyi ve bir çizgiden başka bir desenden sonraki her şeyi nasıl silebilirim?


17

Aşağıdaki dosyada:

Lorem ipsum dolor sit amet, consipetuer adipiscing elit. Ut eu metus id lectus vestibulum ultrisleri. Maecenas rhoncus.

Önce consectetuerve sonra her şeyi silmek istiyorum elit.

İstediğim çıktı:

consectetuer adipiscing elit.

Bunu nasıl yapabilirim?


2
Komut olabilir sed. Ayrıca, perlhatta saf bash da olabilir.
muru

@manuel Bu yanıtlardan biri sorununuzu çözdüyse, lütfen bir dakikanızı ayırın ve soldaki onay işaretini tıklayarak kabul edin. Bu, soruyu yanıtlandığı gibi işaretler ve Stack Exchange sitelerinde teşekkürlerin ifade edilme şeklidir.
terdon

Yanıtlar:


28

Sed kullanırdım

sed 's/^.*\(consectetuer.*elit\).*$/\1/' file

Sed s / find / replace / sözdiziminin kodunu çözdü:

  • s/^.*- satırın başından ( ^) başlayıp ardından .*...
  • \( - adlandırılmış bir blok başlat
  • consectetuer.*elit\.- eşleştirmek istediğiniz ilk kelimeyi, her şeyi ( .*) son kelimeye kadar (bu durumda, izleyen (kaçan) nokta dahil) eşleştirin
  • \) - belirtilen bloğu sonlandır
  • diğer her şeyi ( .*) satırın sonuna kadar eşle ( $)
  • / - yedek bulma bölümünü sonlandırır
  • \1- yukarı \(ve \)yukarı arasındaki ad bloğu ile değiştirin
  • / - değiştirmeyi bitir

1
İyi cevap, ama sed'e ihtiyacınız yok ^ya da $sed en uzun maçı bulmaya çalışacak. Ayrıca sonra nokta kaçırmış olabilir, gerekirse elitekleyebilirsiniz \..
asoundmove

2
@asoundmove "elit" üzerindeki son noktayı iyi yakalayın - Çok keskin bir gözün var! Cevabımı kaçak noktaya ekleyecek şekilde güncelledim. Ayrıca doğru ^ve $gerekli değil - Ben sorgulayıcı (başlangıçta) biraz acemi olduğunu belirttiği gibi orada bıraktım ve bu diğer bağlamlarda yardımcı olabilir.
MikeV

Her zaman sed çözümlerini kopyaladım ve ihtiyaçlarıma uyacak şekilde hackledim, ancak bu cevap sayesinde şimdi anlıyorum gibi hissediyorum. Harika cevap
Tyler

7

Eğer her satır sonra Bunu yapmanın en kolay yolu başlangıç ve bitiş deseni hem içeriyor ile grep. Her satırın başlangıcını ve sonunu silmek yerine, her iki desen arasındaki içeriği de çıktı alabilirsiniz. -oGNU içinde seçenek grepyalnızca eşleşmeleri verir:

grep -o 'consectetuer.*elit' file

Not: belirtildiği gibi, bu yalnızca dosyadaki her satır bu şekilde ayrıştırılabilirse çalışır. Sonra tekrar, tüm tipik kullanım durumlarının% 80'i.


1

AWK'da döngüler için iki tane:

$ awk '{for(i=1;i<=NF;i++) {if ($i == "consectetuer") beginning=i; if($i== "elit.") ending=i }; for (j=beginning;j<=ending;j++) printf $j" ";printf "\n"   }' file.txt 
consectetuer adipiscing elit.

AWK'nın gsub'ı:

$ awk '{gsub(/^.*consectetuer/,"consectetuer"); gsub(/elit.*$/,"elit.");print}' file.txt
consectetuer adipiscing elit.

1

Perl yolu. Bu aslında MikeV'ninsed cevabı ile aynı :

perl -pe 's/.*(consectetuer.*elit).*./$1/' file

-pVasıta "ile verilen senaryoyu uygulandıktan sonra her satırını yazdırmak -e". s/foo/bar/İkame operatörüdür; fooile değiştirilir bar. Parantezler bir desen yakalar ve değiştirmede kullanalım. İlk yakalanan desen, $1ikincisi $2vb.

Böylece, komut consectetuer( .*consectetuer) 'a kadar olan her şeyi , sonra elit( .*elit)' ye kadar olan her şeyi ve sonra satırın ( .*) sonuna kadar olan diğer her şeyi eşleştirecek ve bunu yakalanan desenle değiştirecektir.


1

OP sadece örnek bir satır gibi görünse bile OP birden çok satırda olasılığı hariç tutmazken neden bu soru başlığı " dosyadan " bir satırdan " düzenlenmiştir emin değilim . Her neyse, burada birden fazla hat çözümü sağlamak yararlı olabilir.

Bu, çapraz çizgiler için çalışır:

from1=consectetuer; to2=elit; a="$(cat file)"; a="$(echo "${a#*"$from1"}")"; echo "$from1${a%%"$to2"*}$to2"

Örnekler:

[xiaobai@xiaobai tmp]$ cat file
1
abc consectetuer lsl

home

def elit dd
2 consectetuer ABC elit
[xiaobai@xiaobai tmp]$ from1=consectetuer; to2=elit; a="$(cat file)"; a="$(echo "${a#*"$from1"}")"; echo "$from1${a%%"$to2"*}$to2"
consectetuer lsl

home

def elit
[xiaobai@xiaobai tmp]$ 

başvuru: Kabuk Parametresi Genişletme


1
Mükemmel!
Clément
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.