전체 글
글 739개
-
[리눅스] sed I·M·e 플래그, 매칭과 치환은 다른 층
I는 정규식을 어떻게 찾을지 정하고, \L·\l·\U·\u·\E는 찾은 다음 뭘로 바꿀지 정한다. sed로 대소문자를 만지작거리다 보면 I 플래그와 \u, \l 같은 이스케이프를 같은 부류로 착각하기 쉽다. 이름도 비슷하고 둘 다 "대소문자"를 건드리니 헷갈릴 만하다. 하지만 GNU sed 매뉴얼을 그대로 읽어보면 이 둘은 애초에 작동하는 층이 다르다. 여기에 e 플래그와 M/m 수정자까지 더하면 s 명령 하나에 GNU 확장이 얼마나 쌓여 있는지 눈에 들어온다.I는 매칭, \L·\l·\U·\u·\E는 치환I 수정자는 s/regexp/replacement/I 형태로 붙는데, 이건 정규식을 대소문자 구분 없이 매칭하게 만드는 스위치다. Hello든 HELLO든 hello든 같은 패턴으로 잡힌다는 뜻이다. 반..
-
[리눅스] sed y·=·F·z·v·e, POSIX와 GNU가 갈리는 지점
같은 y와 = 인데도 하나는 POSIX 명세고 하나는 GNU가 몰래 넓혀놓은 자리다. sed 명령을 하나씩 훑다 보면 s·d·p·n 같은 자주 쓰는 것들 뒤에 늘 남는 목록이 있다. y·=·F·z·v·e다. 이름만 보면 다 GNU가 얹은 확장 같지만 실제로는 절반만 그렇다. y와 =는 POSIX 문서에 정식으로 실려 있는 명령이고, F·z·v·e 네 개만 GNU sed 매뉴얼의 Extended Commands 절에 따로 묶여 있다. 이 경계를 모르고 쓰면 다른 sed 구현으로 옮길 때 y와 =는 살아남고 나머지는 통째로 깨진다. POSIX 소속과 GNU 전용, 어디서 갈리나여섯 명령을 표로 정리하면 경계가 바로 보인다. POSIX(Issue 8) 규정 문서에 실려 있는지, GNU sed 매뉴얼(sed...
-
[리눅스] sed 역참조, \n이 패턴이 아니라 내용을 잡는 이유
sed 역참조는 같은 자리를 두 번 찾는 게 아니라, 앞서 잡은 문자열을 그대로 다시 찾는다. sed 치환 문자열(s///) 안에서 \1, & 을 쓰는 건 앞서 매칭된 서브식을 결과에 되받아 쓰는 이야기다. 이 글은 그 얘기가 아니라, 검색 패턴 자체 안에서 \n 을 쓰는 경우를 다룬다. "앞에서 잡은 걸 뒤에서 또 검사한다"는 게 뭔지, GNU 매뉴얼 예제 두 개로 감을 잡고 POSIX 규정으로 경계를 그어본다. 역참조가 다시 매칭하는 건 패턴이 아니라 내용GNU sed 매뉴얼은 역참조를 이렇게 정의한다. "Back-references are used to match the same content as a previously matched subexpression." 서브식이 매칭했던 부분표현식(정규..
-
[리눅스] sed, 버그 아니라 명세대로인 다섯 장면
이상하게 동작하는 sed 스크립트, 적잖은 수는 버그가 아니라 문서에 적힌 그대로다. sed 를 쓰다 보면 "이거 왜 이래?" 싶은 순간이 온다. 읽기전용 파일을 -i 로 건드렸는데 내용이 지워졌다든가, [a-z] 로 걸렀는데 대문자가 섞여 나온다든가. GNU sed 매뉴얼은 이런 사례를 따로 모아 "자주 버그로 신고되지만 버그가 아닌 동작"이라는 절로 정리해뒀다. 그중 다섯 가지를 골라 하나씩 따라가 보면 공통점이 보인다 — 전부 POSIX 규정이나 파일시스템 권한 모델을 그대로 따른 결과다.확장 이스케이프가 스크립트마다 다르게 읽히는 이유\|, \+, \?, \`, \', \, \b, \B, \w, \W — 이 이스케이프들은 POSIX BRE(기본 정규식) 표준에 의미가 정의돼 있지 않다. 정의가 ..
-
[리눅스] sed -z·-u·-l, 남은 옵션 다섯 가지 정리
-z, -u, -l, --follow-symlinks, --debug는 자주 안 써서 매번 매뉴얼을 다시 찾게 되는 GNU sed 옵션들이다. sed 옵션 중 -e, -f, -n, -i는 거의 매일 쓰지만 나머지 다섯 개는 필요한 순간이 아니면 존재조차 잊는다. 그런데 막상 필요해지면 검색해도 짧은 요약만 나오고, 이 옵션이 POSIX에 있는지 GNU 확장인지도 헷갈린다. 이번 글은 -z, -u, -l, --follow-symlinks, --debug 다섯 개를 하나씩 정리하고, 각각 어떤 상황에서 켜야 하는지를 짚는다. 1. -z / --null-data / --zero-terminated기본적으로 sed는 줄바꿈 문자(\n)를 줄의 경계로 본다. -z는 이 경계를 널 바이트(zero byte)로 바..
-
[리눅스] sed 종료 상태 4가지와 q·Q, 확장을 끄는 스위치
sed가 어떻게 죽는지 알아야 스크립트가 왜 실패했는지 읽을 수 있다. sed 스크립트를 파이프라인에 물려두면 언젠가 echo $?가 이상한 값을 뱉는 순간이 온다. POSIX는 성공과 실패 두 가지만 구분하라고 하지만, 실제로 손에 쥔 sed는 GNU sed일 확률이 높고 GNU sed는 종료 값을 넷으로 쪼개 쓴다. 여기에 q와 Q라는 종료 전용 명령, 그리고 확장 기능을 끄는 스위치까지 겹치면 셸 스크립트 안에서 sed 한 줄이 왜 이런 종료 값을 냈는지 헷갈리기 시작한다. 이번 글은 그 조합을 종료 값 기준으로 정리한다.종료 값 0 — 정상 종료가장 흔한 값이다. GNU sed 매뉴얼은 "Successful completion" 한 줄로 끝낸다. 스크립트가 끝까지 실행되고 입력이 정상적으로 소진..