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.