sed 에 대해서 질문입니다.
한창 bash script 를 살펴보고 있는 사람입니다.
script 중에 아래와 같은 라인이 있는데요,
sed -e 's/^[0 ]*\(.*.\)$/\1/' number
위 라인은 number의 맨 앞에 붙어 있는 0들을 제거한 숫자를 뱉어주는 일을 하게 됩니다.
예를 들어서 number에 '00001'이 들어가게 되면 '1'을 뱉고, '00100'이 들어가면 '100'을 뱉어내는 식인데요,
위 명령에서 이해가 안되는건 (1) '[0 ]' 과 (2) '\(.*.\)' 부분입니다.
질문 1. (1) 에 대해서는 왜 [] 안에 0 뿐만이 아니라 공백을 하나 추가해 두었을지가 궁금합니다. 실제로 (1) 부분에 '[0 ]' 이 아닌 '[0]'을 끼워 넣어도 기능에 전혀 문제가 없음을 확인했는데요, 불필요한 공백을 넣어뒀을 것 같진 않고 뭔가 기능이 있을 것 같은데, 알 수가 없네요.
질문 2. (2) 에 대해서는 저렇게 (2)와 같이 쓰여진 부분이 '0 이 아닌 숫자로 시작하는 모든 부분'을 캐치해내는 것 같은데, 그게 어떻게 해서 가능한지 모르겠습니다. 찾아보면 sed 명령에서 '.' 와 같이 dot 이 찍힌 부분은 '모든 문자로 치환될 수 있는' 기능을 가지게 되어서 (2) 와 같이 '.*.' 같은 형식으로 쓰이면 사실상 '*' 과 별 차이가 없을 것 같은데 또 바꿔 넣어보면 다른 결과가 나오구요.. 몇 가지 시도를 해 보면 (1) 부분은 [0] 으로 바꿔써 넣어도 관계가 없지만, (2) 부분은 \(.*.\) 로 쓰지 않으면 제대로된 결과가 나오지 않습니다.
1. 아마도 숫자 앞에 공백 문자가 있는 경우를
1. 아마도 숫자 앞에 공백 문자가 있는 경우를 고려해 놓은 것으로 보입니다. 즉 "000100" 도 처리하고 " 공백공백공백100" 도 처리하려고 한 것이 아닐까 싶네요.
2. 두번째는 00000 일 경우, 0 을 만들어 주려고 한 것 같은데요. '\(.+\) 을 어렵게 설정한 것 같네요.
말씀하신게 맞는 것 같습니다.
두번째의 경우 00000의 경우 0을 만들어주려고 그래 놓은게 맞는 것 같습니다. 말씀해주신 \(.+\) 를 대체해서 넣으면 제대로 작동이 안되긴 하지만, 답변 감사드립니다.
아는 만큼 보인다고... 본문에 적은 것과 다른
아는 만큼 보인다고... 본문에 적은 것과 다른 패턴이 있을 거라 짐작됩니다.
(김정균님이 이미 적어주셨네요)
본문에 적으신 패턴만 처리하자면 sed -e 's/^[0 ]*//' 만으로도 충분한데요.
조금 자세히 설명해 주실 수 있을까요??
말씀하신대로 sed -e 's/^[0 ]*//' 만으로도 앞자리에 적힌 0들을 삭제하는 역할이 되네요. 그런데 제가 이해한거에 따르면 ^[0 ]* 와 같이 적으면 '문장 처음부터 시작해서 0이나 공백으로 시작하는 패턴 모두'를 의미하게 되어서 예를 들어 '00100'과 같으면 전체 '00100'이 인식돼서 이를 모두 없애버릴 것 같은데 맨 앞의 '00'만 없애버리네요. ^[0 ]* 이 왜 맨 앞에 0들에 해당하는 패턴만을 의미하게 되는건가요??
본문글 보면서 오타인가 싶었는데, 아무래도 파일명
본문글 보면서 오타인가 싶었는데, 아무래도 파일명 와일드카드에 사용되는 *과 혼동하시는 것 같습니다.
정규표현식의 *는 '0번 이상의 반복'을 의미합니다. 이 자체만 써서는 에러가 날 거고, 그 앞에 있는 패턴이 0번(아예 없는 경우) 이상 반복되는 것에 매치됩니다.
[0 ]*는 "0또는 스페이스"가 반복되는 부분에 매치되지요. 1은 0또는 스페이스에 해당되지 않으니까 그 직전까지만 매치됩니다.
좋은 하루 되세요!
아아!!
아 그렇게 되는 거군요, 좋은거 배워갑니다 ㅎㅎ 자세한 답변 감사드립니다, 좋은하루되세요!!
댓글 달기