sed, awk - minden 2. karakter törlése, 32 karakterig

Sziasztok,

Hogy lehet megoldani, hogy egy stringból (bcrypt hash-ről van szó,), minden 2. karaktert töröljek, de csak 64 karakterig? (másképpen fogalmazva, minden 2. karaktert törölnöm kellene, egészen addig míg a törölt karaktertek száma eléri a 32-t)

input: $826y4$31226$dZbD2JfjeZ3TbIe44M0zclck2O4T1l8j7Y7jfl6maZ2ecU900ObFJk9iz8iCE5AODPQx4QkiQjJOVmG
kívánt output: $2y$12$ZDJjZTI4MzlkOTljYjlmZeU0OFJk9iz8iCE5AODPQx4QkiQjJOVmG

sed-el sikerül, de ez minden 2. karaktert töröl.
command: sed -E 's/(.)./\1/g' file.txt

Megoldható valahogy? Preferált megoldásként sed, awk használata jó lenne.

Köszönöm az ötleteket.

Hozzászólások

Ez nem oly elegáns, de nagyjából megteszi:


{
  meddig = length();
  if ( meddig > 64 )
  {
    meddig = 64;
    hosszu = 1
  };
  for ( i = 1; i <= meddig; i = i+2 )
  {
    printf "%s", substr( $0, i, 1 )
  };
  if ( hosszu == 1 )
  {
    printf "%s", substr( $0, 65, length()-64 )
  }
  print ""
}

Üdv,
Marci

Kétfelé vágva a fájlt:

echo $(cut -b-64 file.txt | sed -E 's/(.)./\1/g')$(cut -b65- file.txt)

--
eutlantis

$ echo '$826y4$31226$dZbD2JfjeZ3TbIe44M0zclck2O4T1l8j7Y7jfl6maZ2ecU900ObFJk9iz8iCE5AODPQx4QkiQjJOVmG' | cut -c `seq -s ',' 1 2 63`64-
$2y$12$ZDJjZTI4MzlkOTljYjlmZeU0ObFJk9iz8iCE5AODPQx4QkiQjJOVmG

Akkor rakd oda te neki a vesszőt :)

echo '$826y4$31226$dZbD2JfjeZ3TbIe44M0zclck2O4T1l8j7Y7jfl6maZ2ecU900ObFJk9iz8iCE5AODPQx4QkiQjJOVmG' | cut -c `seq -s ',' 1 2 63`,64-

A végén a 63` és a 64- közé került egy vessző. Ha nincs ott, akkor neked a vége 59,61,6364- (és ugyebár 6364. karakter nincs). Nekem a vége pedig 59,61,63,64-.

Ha linuxos cut, akkor a --complement-tel még klasszabb lehet, ui. akkor csak a seq -s , 2 2 64 kell. A --complement-tel nem a 2,4,6,8,...,64. karaktert jeleníti meg, hanem pont azokat törli ki (legalábbis úgy gondolom). FreeBSD-n levő cut-nak nincs --complement opciója, ezért kellett a végére a 64-.

Működik....
root@Xenon-XR3:~# echo '$826y4$31226$dZbD2JfjeZ3TbIe44M0zclck2O4T1l8j7Y7jfl6maZ2ecU900ObFJk9iz8iCE5AODPQx4QkiQjJOVmG' | cut --complement -c `seq -s ',' 2 2 64`
$2y$12$ZDJjZTI4MzlkOTljYjlmZeU0OFJk9iz8iCE5AODPQx4QkiQjJOVmG

Ezer hála.

Ha file-bol olvasok be több sort, akkor a 'cat' parancs: cat bcrypts_for_clean.txt | cut --complement -c `seq -s ',' 2 2 64`
a megfelelő?