jq가 JSON과 동일한 데이터 타입을 지원한다는 점을 떠올려 봐요.
JSON은 문자열을 이렇게 설명해요:
문자열은 0개 이상의 유니코드 문자로 이루어진 나열이며, 큰따옴표로 감싸고 백슬래시 이스케이프를 사용해요.
문자열 안에서는 백슬래시 문자를 사용해 "특수" 문자를 넣을 수 있어요:
\" 큰따옴표 문자 그대로\\ 백슬래시 문자 그대로\n, \t, \r, \f, \b
\uAAAA (A는 16진수 숫자)문자의 개수를 구하려면 length 함수를 사용해요.
$ jq -cn --args '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7
슬라이스 표기법으로 부분 문자열을 추출할 수 있어요.
문법은 .[i:j]예요.
반환되는 부분 문자열의 길이는 j - i이고, 인덱스 i(포함)부터 인덱스 j(미포함)까지의 문자를 반환해요.
두 인덱스 모두 음수가 될 수 있고, 이 경우 문자열의 끝에서부터 거꾸로 세요.
두 인덱스 모두 생략할 수 있고, 이 경우 문자열의 시작이나 끝을 가리켜요.
인덱스는 0부터 시작해요.
"abcdefghij"[3:6] # => "def"
"abcdefghij"[3:] # => "defghij"
"abcdefghij"[:-2] # => "abcdefgh"
문자열을 이어 붙일 때는 +를 사용해요:
"Hello" + " " + "world!"
# => "Hello world!"
문자열 배열이 주어졌을 때는 add를 사용해요:
["Hello", " ", "world!"] | add
# => "Hello world!"
나누기는 split/1 함수나 / 연산자를 사용해요:
"Hello beautiful world!" | split(" ") # => ["Hello", "beautiful", "world!"]
"Hello beautiful world!" / " " # => ["Hello", "beautiful", "world!"]
split/1의 역은 join/1이에요.
문자열을 문자 배열로 바꾸는 일은 자주 필요해요. 이를 위한 방법은 두 가지가 있어요:
빈 문자열을 기준으로 나누기
"Hi friend 😀" / "" # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
explode로 코드포인트 배열로 만들기
"Hi friend 😀" | explode # => [72,105,32,102,114,105,101,110,100,32,128512]
implode는 explode의 역이에요.
index/1 함수를 사용해요. 인덱스는 0부터 시작해요.
"hello" | index("el")' # => 1
부분 문자열이 문자열 안에 없으면 결과는 null이에요.
"hello" | index("elk") # => null
문자열 안에서 \(expression) 시퀀스는 그 표현식의 _결과_를 문자열에 넣어요:
"The current datetime is \(now | strflocaltime("%c"))" # => "The current datetime is Wed Nov 16 17:06:33 2022"
ascii_downcase와 ascii_upcase 함수를 사용해요.
jq는 정규 표현식을 풍부하게 지원해요. 이 내용은 나중 레슨에서 다뤄요.
이 연습 문제에서는 로그 항목을 처리해요.
각 로그 줄은 다음과 같은 형식의 문자열이에요: "[<LEVEL>]: <MESSAGE>".
로그 레벨은 세 가지가 있어요:
INFOWARNINGERROR세 가지 과제가 있는데, 각 과제는 로그 줄을 주고 그것으로 무언가를 해 보라고 해요. 이 과제를 푸는 방법은 아주 많아요. 위의 예제에서 좋아하는 기법을 골라서 무엇을 만들 수 있는지 확인해 봐요.
message 함수를 구현해서 로그 줄의 메시지를 반환하게 해요:
"[ERROR]: Invalid operation" | message
# => "Invalid operation"
앞뒤의 공백은 제거해야 해요:
"[WARNING]: Disk almost full\r\n" | message
# => "Disk almost full"
log_level 함수를 구현해서 로그 줄의 로그 레벨을 반환하게 해요. 이때 소문자로 반환해야 해요:
"[ERROR]: Invalid operation" | log_level
# => "error"
reformat 함수를 구현해서 로그 줄의 형식을 바꿔요. 메시지를 먼저 놓고 그 뒤 괄호 안에 로그 레벨을 넣어요:
"[INFO]: Operation completed" | reformat
# => "Operation completed (info)"