sed 명령어

전민의 이미지


아래 명령어 해석 해주십시오.

[~]echo "1234 -a aa a -b bb -c cc -d dd" | sed "s/.*-a \([^-]\+\) -.*/\1/"
결과 : aa a

.*-a 는 -a 이전의 모든 문자열을 뜻하는 건 알겠습니다.
실행시키기 전에 결과를 예측할 때는 -b bb 가 나올 줄 알았는데 아니더군요.
이렇게 예측한 이유는 .*-a 이후에 ([^-]+) 즉 -로 시작하는 단어를 1에 저장, -.*는 그 다음 - 인 -c 이후의 모든 문자, 이렇게 해석했습니다.

테스트 겸해서
echo "1234 -a aa a =b bb -c cc -d dd" | sed "s/.*-a \([^=]\+\) -.*/\1/" 를 실행하니
1234 -a aa a =b bb -c cc -d dd
이렇게 나오는 군요.. 이건 또 왜 이렇게 나오죠?

echo "1234 -a aa a -b bb -c cc -d dd" | sed "s/.*-a \([^-]\) -.*/\1/" 이렇게 '+'를 빼도 1234 -a aa a -b bb -c cc -d dd
이렇게 나옵니다.

그럼 부탁드립니다

블루스크린의 이미지

[^-] 은 - 를 제외한 다른 한 글자와 매칭합니다

.
.
.
.
.
-a \([^-]\+\) - 가
-a aa a - 와 매치되고
([^-]+) 부분이 aa a 가 되니까
aa a 가 나오는 거죠

http://kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/x10468.html

그런데 숙제가 아닌가 의심이 되네요 ....

-------------------------------------------------------------------------------
이 댓글(comment)의 수정 및 삭제를 위해 이 글에 답글(reply)을 쓰지 말아 주십시요.
의견이 있으시면 원 글에 댓글(comment)로 써 주세요.

-------------------------------------------------------------------------------
이 댓글(comment)의 수정 및 삭제를 위해 이 글에 답글(reply)을 쓰지 말아 주십시요.
의견이 있으시면 원 글에 댓글(comment)로 써 주세요.

전민의 이미지

숙제라는 오해를...
다른 shell script를 분석하다가 위 명령을 봤는데..
[^-]가 '-'가 아닌 모든 문자를 나타내는 건가요?
이 부분을 몰라서 헤맸습니다.

답변 감사합니다.

klara의 이미지

해당 내용은 쉘스크립트 자체에 대한 것이 아니라 정규표현식(regular expression)에 대한 내용입니다.