Bash'ta bir regex yazmaya çalışmak

Regex için yeni ve bash betiğine bir regex yazmaya çalışıyorum. Satırı ile satırdaki ikinci kelimeyi döndürmesi gereken bir regex ile eşleştirmeye çalışıyorum.

regex = "commit\s+(.*)"
line = "commit 5456eee"
if [$line =~ $regex] 
then
 echo $2
else 
 echo "No match"
fi

Bunu çalıştırdığımda aşağıdaki hatayı alıyorum: -

man.sh: line 1: regex: command not found
man.sh: line 2: line: command not found

I am new to bash scripting . Can anyone please help me fix this . I just want to write a regex to capture the word that follows commit

0
Not: = ~ operatörü yalnızca çift köşeli sözdizimi ile geçerlidir [[..]]
katma yazar David C. Rankin, kaynak
Değişken adı ile değer arasında bir boşluk bıraktığınızdan, görme komutunuz bulunamadı. Örnek: regex = "commit \ s + (. *)", Regex = "commit \ s + (. *)" Olmalı. Aşağıdaki cevaplara bakınız.
katma yazar Tim Rijavec, kaynak

6 cevap

If you really only need the second word you could also do it with awk

line = "commit 5456eee"
echo $line | awk '{ print $2 }'

veya bir dosyanız varsa:

cat filename | awk '{ print $2 }'

Sadece bir çözüm olmasa bile, çoğu linux sistemde awk bulunmalıdır.

1
katma
Çıktıyı bir değişkene nasıl kopyalarım?
katma yazar Newbie, kaynak
Başka bir boru ile yönlendirebilir, cat dosyaadı | awk '{print $ 2}'> dosya adı veya $ çıkışındaki çıktıyı yakalamak için output = $ (cat dosyaadı | awk '{print $ 2}') 'ı yapın.
katma yazar cb0, kaynak

Bir regex istemiyorsanız, parametre genişletme/alt dize çıkarma istersiniz:

line="commit 5456eee"
first="${line% *}"
regex="${line#* }"
if [[ $line =~ $regex ]] 
    then
    echo $2
else 
    echo "No match"
fi

$first == 'commit', $regex == '5456eee'. Bash provides all the tools you need.

1
katma

Eşittir işaretinin etrafındaki boşlukları kaldırmalısınız, aksi takdirde bash, regex komutunu = ve "commit \ s + (. *)" bağımsız değişken olarak. Sonra, boşlukları da if durumunda da kaldırmalı ve dizeleri alıntılamalısınız:

$ regex="commit\s+(.*)"
$ line="commit 5456eee"
$ if [ "$line"=~"$regex" ]
> then
>   echo "Match"
> else 
>   echo "No match"
> fi
Match
0
katma
[..] için = ~ operatörü yok, yalnızca [[..]]
katma yazar David C. Rankin, kaynak
Operatör etrafında boşluklar olmadığı sürece = ~ komutunu kullanabilirsiniz.
katma yazar Tim Rijavec, kaynak

Sonuçta elde edilen yakalama grubunu (eğer varsa) elde etmenin basit bir yolu, maç sonuçlarını kendi dizisine koyan BASH_REMATCH 'u kullanmaktır:

regex=$"commit (.*)"
line=$"commit 5456eee"
if [[ $line =~ $regex ]] 
then
 match=${BASH_REMATCH[1]}
 echo $match
else 
 echo "No match"
fi

Yalnızca bir tane yakalama grubunuz olduğundan, dizi içinde BASH_REMATCH [1] olarak tanımlanır. Yukarıdaki örnekte, dönen BASH_REMATCH [1] sonucuna $ match değişkenini atadım:

5456eee
0
katma

belki senaryonuzu ile başlatmadınız

#!/bin/sh

veya

#!/bin/bash

Kullanmakta olduğunuz dili tanımlamak için ...? İlk sıran olmalı. o zaman dikkatli olun, boşluklar bash içinde sabittir. "İf" ifadenizde şöyle olmalı:

if [ $line =~ $regex ]

check this out and tell us mveyae about the errveyas you get

0
katma

Bu betiği test.sh gibi bir dosyaya yaparsanız

ve böyle yürütmek:

test.sh commit aaa bbb ccc
   $0     $1    $2  $3  $4

Argümanları kolayca $ 0 $ 1 ile alabilirsiniz ...

0
katma