Linux'ta sınırlayıcıdan önce metni nasıl silebilirim


16

Sınırlayıcıdan önce bir satırdaki metni silmem gerekiyor.

Örneğin:

(123434): hello::{apple,orange,mango}.

Önce metni silmem gerekiyor :. yani (123434).

Linux'ta bu görevi gerçekleştirmek için herhangi bir komut var mı?


Bakmak isteyebilirsiniz sedya daawk
— Paul

Bu metin bir dosyanın parçası mı, yoksa bash değişkeninin parçası mı?
— Bernhard

Dosyanın bir parçasıdır.
— user80538

Yanıtlar:


14

Bu sedkomut hile yapmalı. Aşağıdaki komut dosyanın üzerine yazacaktır:

sed -i 's/^[^:]*:/:/' file

Yalnızca çıktıyı yazdırmak için -ibayrağı kaldırın . Çıktıyı yeni bir dosyaya koymak için -ibayrağı kaldırın ve çıktıyı yeniden yönlendirin:

sed 's/^[^:]*:/:/' file > new_file

Çizgi büyü yaptı ... çıktı dosyanın kendisi yerine ..
— user80538

sdiff kullanarak iki dosyayı karşılaştırdığımda, her iki dosyadan da metni kaldırdıktan sonra, kaldırılan metni bana gösteren fark. bu komut dosyanın üzerine yazılır veya yalnızca çıktı gösterilir.
— user80538

Çalıştı .. Yukarıdaki komutta basit değişiklikler yaparak örneğimden 'merhaba' ve {elma, portakal, mango} çıkarabilir miyim?
— user80538

@ user80538, Bu bağlamda alıntı dediğinizde ne istediğinizi söylemek zor . Bu daha büyük bir kabuk betiğinin parçası mı? Çözmeye çalıştığınız daha büyük sorunun ayrıntılarıyla yeni bir soru sormak isteyebilirsiniz.
— drs

Aynı veriye sahip iki dosyanın basit bir karşılaştırmasıdır, ancak verilerin iki dosyada nerede farklı olduğunu bulmanız yeterlidir. Satırdaki her bir bölümü kontrol etmem gerekiyor. Ayrı bölümlerdeki veriler karışabilir. {elma, portakal, mango} gibi {elma, mango, portakal} olabilir.
— user80538

14

Şunları kullanabilirsiniz cut:

echo '(123434): hello::{apple,orange,mango}.' | cut -d: -f2-

5

Bunu oldukça basit bir Bash talimatıyla yapabilirsiniz:

mytext="(123434): hello::{apple,orange,mango}."

echo ${mytext#*)}

Bu yazdırılacaktır : hello::{apple,orange,mango}.. Ön ekleri ve son ekleri benzer şekilde kesebilirsiniz. Ayrıca, önek ve sonek tanımları joker karakterler içerebilir.

Kesme öneki - ilk önek joker karakter eşleşmesine kadar: ${variable#prefix}

Kesme öneki - son önek joker karakter eşleşmesine kadar: ${variable##prefix}

Son eki kes - ilk son ek joker eşleşmesine kadar: ${variable%suffix}

Son eki kes - son eke kadar joker karakter eşleşmesi: ${variable%%suffix}

İlk bakışta belirsiz görünebilir, aşağıdaki örneğe bakın:

mytext="xAxBxAxBx"
echo ${mytext#*A}    # will print: xBxAxBx
echo ${mytext##*A}   # will print: xBx
echo ${mytext%B*}    # will print: xAxBxAx
echo ${mytext%%B*}   # will print: xAx
echo ${mytext%%C*}   # will print: xAxBxAxBx

Son örnekte, desen eşleşmediğinden hiçbir şey kesilmiyor.


Kullanmak daha sağlam olurdu echo ${mytext#*:}:. Bu, (123)(434): hello::{apple,orange,mango}.ve gibi satırları düzgün bir şekilde işleyecektir 123434: hello::{apple,orange,mango}.
— drs

örnekten B'den sonra metin almak için echo $ {mytext %% B *} komutunu değiştirmenin herhangi bir yolu var mı?
— user80538

@ user80538 evet, metni B'den önce kesin ;-) dahil, yani: ilk B'den sonraki metin için $ {mytext # * B} ve ikinci B'den sonraki metin için $ {mytext ## * B}.
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.