Debugging

sed 는 따로 디버깅을 위한 옵션이나 기능을 제공하지 않습니다. 따라서 디버깅을 하려면 직접 p 명령을 이용해서 pattern space 에 있는 내용을 조회해야 하는데요. 그런데 p 명령은 printable 문자만 표시되기 때문에 내용 중에 non-printable 문자가 사용됐을 때는 정확한 값을 확인할 수가 없습니다. 따라서 sed 는 디버깅에 활용할 수 있도록 다음과 같은 명령을 제공합니다.

pattern space 에 있는 내용을 escape sequence 를 이용해 표시해줍니다.

# '\a' 은 non-printable 문자로 아예 값이 표시되지 않는다.
# '\t', '\v' 값은 space, newline 과 구분하기가 어렵다.
$ echo -e "valX\a111\nvalY\t222\nvalZ\v333" | sed -En 'N;N;p'
valX111
valY    222
valZ
    333

# 'l' 명령을 사용하면 escape sequence 를 이용해 값을 있는 그대로 표시해줍니다.
$ echo -e "valX\a111\nvalY\t222\nvalZ\v333" | sed -En 'N;N;l'
valX\a111\nvalY\t222\nvalZ\v333$

l 명령은 출력이 newline 문자에 의해 개행이 되지 않기 때문에 따로 line-wrap length 값을 사용해 개행하는데요. sed 명령의 -l N 옵션을 통해서 값을 설정할 수 있습니다.

l 명령을 활용한 디버깅 예제

다음은 데이터 파일에 숫자 라인과 알파벳 라인이 혼합되어 있을 경우 숫자 라인 다음에 알파벳 라인이 올 경우만 값을 표시하는 스크립트입니다. 이때 l 명령을 이용함으로써 매 라인 입력 시마다 변경되는 pattern space 의 값을 조회해 볼수 있습니다.

$ cat file
111
222
ABC
333
444
DEF
555

# 숫자 라인 다음에 알파벳 라인이 올 경우 프린트
$ sed -En '$!N; /[0-9]+\n[A-Z]+/p; D' file
222
ABC
444
DEF

# 'l' 명령을 이용함으로써 pattern space 의 내용을 확인할 수 있다.
$ sed -En '$!N; l; /[0-9]+\n[A-Z]+/p; D' file
111\n222$
222\nABC$  <---- match !
222
ABC
ABC\n333$
333\n444$
444\nDEF$  <---- match !
444
DEF
DEF\n555$
555$

$ 문자는 pattern space 의 끝을 나타냅니다.

현재 pattern space 에 입력된 라인넘버를 표시해줍니다.

$ echo -e "valX\a111\nvalY\t222\nvalZ\v333\nvalA:444" | sed -E '='   
1
valX111
2
valY    222
3
valZ
    333
4
valA:444

$ echo -e "valX\a111\nvalY\t222\nvalZ\v333\nvalA:444" | sed -E 'N;=' 
2
valX111
valY    222
4
valZ
    333
valA:444

Regex 테스트

https://regex101.com/ 사이트를 활용하면 도움이 됩니다.

https://regexper.com/ regex railroad diagram generator