Dizeyi iki parantez arasında yazdırın


14

Bu satırları içeren bir dosyam var

G8 = P(G1,G3)
G9 = P(G3,G4)
G12 = P(G2,G9)
G15 = P(G9,G5)
G16 = P(G8,G12)
G17 = P(G12,G15)

Çıktıya ihtiyacım var

G1,G3
G3,G4
.....

Sed / grep komutuyla veya perl kullanarak nasıl yapabilirim?

Yanıtlar:


18

Diğer birkaç yol:

  • sed

    sed 's/.*(\(.*\))/\1/' file 
  • perl

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

    veya

    perl -lanF"[()]" -e 'print $F[1]' file 

    veya

    perl -pe 's/.*\((.+?)\).*/$1/;' file 
  • awk

    awk -F"[()]" '{print $2}' file 
  • kabuk

    while IFS="()" read a b; do echo "$b"; done < file 

awk yönteminin nasıl çalıştığı hakkında daha fazla bilgi verir misiniz
?,

1
@satch_boogie, awk'ın -Fsatırı alanlara ayırmak için hangi karakterleri kullanacağını seçmenizi sağlar. Burada, []parantez açma ve kapamadan oluşan bir karakter sınıfı ( ) veriyorum . Bu yüzden üzerinde çizgi bölecek (ve üzerinde ). Sonuç olarak, 2. alan parantezin içeriği olacaktır. Örneğin, dize ile G8 = P(G1,G3)foo, $1olacak G8 = P, $2olacak G1,G3ve $3olacak foo.
terdon

7

Bunu yapmanın birden fazla yolu var:

perl -nle 'print $1 if /\((.*)\)/' file

veya:

awk 'NR > 1 {print $1}' RS='(' FS=')' file

5
grep -oP '\(\K[^)]+' file

Bu, açılış parantezini arar, yok sayar, ardından izleyen tüm parantez dışı karakterleri yazdırır.

GNU grep gerektirir


5

sed 's/^.*(//;s/)$//' /path/to/file

Bunu yıkmak için:

sedolan sTeam, edin-. 's/^.*(//;s/)$//'şu şekilde bozulan komut dosyasının gönderildiği sedkomuttur:

s/^.*(//    substitute nothing for the beginning of any line (`^`) followed by anything up until an open-paren (`(`)
s/)$//      substitute nothing for a close-paren (`)`) followed immediately by the end of a line

1

Basit bir kesim çözümü:

$ cat test01 | cut -d "(" -f2 | cut -d ")" -f1


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.