루프가 인쇄할 수 없으면 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정규식에 별표를 추가 하지 마세요 . 별표는 0개 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과 같은 다른 쉘에서도 작동할 수 있지만 위에서 언급한 세 가지 쉘에서만 테스트했습니다.

그런데 "탐욕스러운" 일치를 원하는 경우(즉, 두 번째 및 후속 단어(있는 경우) 대신 마지막 단어를 얻을 수 있도록 가장 짧은 문자열 대신 가장 긴 일치 문자열)를 ##대신 사용하십시오 #.

관련 정보