텍스트 파일에서 한 줄에 중첩된 괄호의 깊이를 찾으십니까?

텍스트 파일에서 한 줄에 중첩된 괄호의 깊이를 찾으십니까?

그리고 각 줄의 시작 부분에 깊이를 나타내는 점(또는 임의의 문자) 수를 인쇄합니다. 쉘 스크립트에는 3개의 매개변수가 있어야 합니다. 첫 번째는 문자 c이고, 두 번째는 레벨 n당 문자 수, 세 번째는 입력 파일입니다. 스크립트는 선행 공백을 k*n 문자 c로 바꿔야 합니다. 여기서 k는 대괄호 중첩 수준입니다.

a ( b 
     c d [ e ] f [
  g h { j (
            k ) } l m
     n ] o ) p
q r
would be modified as follows if the script is run with parameters c='.' and n=1:
a ( b
.c d [ e ] f [
..g h { j (
....k ) } l m
..n ] o ) p
q r

내 시도는 다음과 같습니다.

c=$1

sed 's|^[[:blank:]]*||g' $3

curr=0
next=0

nb=0
n=$2
makeIndent() {
        local indentChar=$1
        local num=$2
        printf '%*s' "$num" | tr ' ' "$indentChar"
}
while read -r line; do
        for char in '(' '[' '{'; do
                nb=$((curr+1))
                next=$((next+nb))
        done

        for char in ')'']' '}'; do
                nb=$((curr-1))
                next=$((next-nb))
        done
        n=$(($n*$curr))
        indentString=$(makeIndent "$c" "$n")
        curr=$next
        n=$2
        echo "$indentString$line"
done < $3

이와 같은 것을 인쇄하지 않고 어떻게 선행 공백을 제거할 수 있습니까?

a(b
c d[ e]f [
g h { j (
k)}l m
n ]o )p
q r

다음에 인쇄되는 것은 (c는 ".", n은 1)입니다.

a(b
.....c d[ e]f [
...............g h { j (
...................................k)}l m
...........................................................................n ]o )p

이는 마지막 행이 삭제됨을 의미합니다. 마지막 행을 그대로 유지하려면 어떻게 해야 합니까? 그리고 계산 부분이 잘못됐네요. 그래서 계산 함수를 만들고 for 루프를 약간 변경하는 등 깊이를 계산할 수 있는 방법을 찾으려고 노력했습니다.

count() {
        local a=$1
        local file=$2
        awk -F\$a '{ print NF-1 }' $file
}
 for char in '(' '[' '{'; do
                nb=$(count "$char" "$3")
                next=$((next+nb))
        done

        for char in ')'']' '}'; do
                nb=$(count "$char" "$3")
                next=$((next-nb))
        done

상황은 더 나빴습니다.

답변1

해결책을 알아냈습니다.

#!/bin/sh

c=$1
curr=0
n=$2
filename=$3
deletespaces() {
        local line=$1
        echo "${line}" | sed -e 's/^[ \t]*//'
}
printchar() {
        local indentChar=$1
        local num=$2
        v=$(printf '%*s' $num "" | tr ' ' "$indentChar")
        echo "$v"
}
counto() {
        local l=$1
        grep -o "[[|{|(]" <<<"$l" | wc -l
}

countc() {
        local l=$1
        grep -o "[]|}|)]" <<<"$l" | wc -l
}
while read -r line; do
        n=$((n*$curr))
        indentString=$(deletespaces "$line")
        printCharr=$(printchar "$c" "$n")
        echo "$printCharr$indentString"

        o=$(counto "$line")
        curr=$(( $curr + $o ))

        cl=$(countc "$line")
        curr=$(( $curr - $cl ))
        n=$2
done < "$filename"

기본적으로 각 줄에 대해 내가 하는 일은 선행 공백을 제거하고 각 줄의 각 첫 글자에 대한 대괄호 깊이를 계산하는 것입니다(구체적으로 왼쪽 대괄호가 1개 있으면 1만큼 늘리고 오른쪽 대괄호를 만나면 1만큼 늘린 다음 줄입니다. 1씩 입력하고 다음 줄에 입력되는 문자 수를 나타내는 변수 curr에 값을 저장합니다. 그런데 n은 임의로 입력된 숫자입니다. 주요 작업은 k*n(k는 curr, 대괄호의 깊이) 문자를 인쇄하는 것이므로 n은 상수여야 합니다. 이것이 내가 while 루프의 끝에서 n=$2를 재설정한 이유입니다.

관련 정보