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