ループが印刷できない場合、awk

ループが印刷できない場合、awk

Test次の変数があります

Test="Environment Dev"

col2char 1を他の文字と比較してenvのフルネームを印刷したいと思います。

これは私がしたことです。

echo $Test|awk '{
if ($2 == "^D*")
print "DEV";
else
print "$2"
}'

出力が得られたが$2テストであれば、所望の出力Dと比較した。TTEST

私もこれを試しましたが、出力は変更時に変わりませんでしたcol2

echo $Test|awk '{
if ($2 ~ "^D*")
print "DEVELOPMENT"
else
print "$2"
}'
DEVELOPMENT

私が間違っている部分を助けてください。

答え1

awkスクリプトにいくつかのエラーがあります。

  • ~ /whatever/正規表現の場合。
  • ^D正規表現にアスタリスクを追加しないでください。アスタリスクはゼロD文字と一致します。
  • $2そのまま印刷したくない場合は、二重引用符を削除してください。

考えられる解決策:

echo $Test | awk '{
if ($2 ~ /^D/)
  print "DEV";
else
  print $2
}'

答え2

bashorを使用している場合は、kshorをzsh使用する必要もなく、を使用してプレフィックスを削除awkできます。この場合、プレフィックス「最初のスペースの前のすべての文字」:${parameter#word}

$ Test="Environment Dev"
$ SecondWord=${Test#* }
$ echo $SecondWord
Dev

$ [[ $SecondWord =~ ^D ]] && echo DEV || echo $SecondWord
DEV

$ SecondWord=Foo
$ [[ $SecondWord =~ ^D ]] && echo DEV || echo $SecondWord 
Foo

これはBourneなどの他のシェルでも機能しますが、上記の3つのシェルでのみテストしました。

ただし、「欲張りな」一致が必要な場合(つまり、2番目と後続の単語(存在する場合)の代わりに最後の単語を取得できるように、最短の文字列ではなく最長の一致文字列)を##代わりに使用してください#

関連情報