Kabuk Betiği: Bazen başlangıçta metnin ortasından dize al


9

Bir kısmı bu (düzenlenmiş değerler) gibi görünüyor büyük bir metin dosyası var:

JULIANA XXXX006060 LI1033322 THC BRL 730.00
XXXX006296 AA1004737 THC BRL 1,740.00
SANTOS JULIANA XXXX006668 AA1004786 THC BRL 8,150.00
SANTOS JULIANA CABINDA XXXX006697 AA1004777 THC BRL 2,325.00
SANTOS JULIANA XXXX006699 AA1004790 THC BRL 2,325.00
JULIANA BATA XXXX006141 CCC012946 THC BRL 1,460.00
JULIANA BATA XXXX006153 CCC013054 THC BRL 870.00
JULIANA XXXX006269 CCC013105 THC BRL 870.00
JULIANA XXXX006295 CCC013083 THC BRL 870.00
JULIANA BATA XXXX006305 CCC013043 THC BRL 1,460.00

Her zaman (bir cutya awkda başka bir şey ile başlayan) dize kapmak istiyorum XXXX00, ama asla aynı alan numarası.

Bunu bir kabuk komut dosyasında nasıl yapabilirim?

Yanıtlar:


12

Sadece grepbunun için:

grep -oE 'XXXX00[0-9]*' file
  • -o: Yalnızca eşleşen parçayı yazdırır.
  • -E: Genişletilmiş düzenli ifadeleri etkinleştirir.
  • [0-9]*: Aranacak dizeden sonra yalnızca rakamlar görünmelidir.

Normal ifadenin -Eseçeneğe ihtiyacı olmadığını unutmayın (ancak zarar vermez).
Jonathan Leffler


3

grepPCRE ile kullanma :

% grep -Po '(^|\s)\KXXXX00[^\s]*(?=(\s|$))' file.txt
XXXX006060
XXXX006296
XXXX006668
XXXX006697
XXXX006699
XXXX006141
XXXX006153
XXXX006269
XXXX006295
XXXX006305

-wBu durumda (word) ile kurtulabilirsiniz , kurucu karakterler kelimesinin şu şekilde değerlendirildiğine dikkat edin [[:alnum:]_]:

% grep -wo 'XXXX00[^ ]*' file.txt
XXXX006060
XXXX006296
XXXX006668
XXXX006697
XXXX006699
XXXX006141
XXXX006153
XXXX006269
XXXX006295
XXXX006305

2

Birkaç başka yol

GNU ile awk

awk -vRS='[[:space:]]+' '/^X{4}0{2}/' file

GNU eski sürümleri ile awk, --re-intervalböylece, gerekli olabilir

awk --re-interval -vRS='[[:space:]]+' '/^X{4}0{2}/' file

İle trvegrep

<file tr -s '[:space:]' '[\n*]' | grep '^X\{4\}0\{2\}'

1
sed 's/[^0]*  *\([^ ]*\).*/\1/' <in >out

alan sayıları farklı gibi görünüyor çünkü orada bir kişi listeniz var ve farklı sayıda isimleri var. ama muhtemelen hiçbirinin içinde 0 olan bir isim yoktur, bu yüzden içinde bir tane olan ilk boşlukla ayrılmış dize kadar tamamen kesin, kaydedin ve tüm bunları kesin.

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.