텍스트 파일을 구문 분석하여 새로운 형식으로 출력합니다.

텍스트 파일을 구문 분석하여 새로운 형식으로 출력합니다.

쉘 스크립트를 사용하여 파일 파서를 배우려고 하는데 입력 파일이 다음 input.txt과 같습니다.

 int A[4];   /* 0  16*/
 char B[15];  /* 16 31*/
 /* Padding may be required here */
 long int C[2]; /*32  8*/

위의 내용을 다음 출력 파일 input.txt처럼 원하는 형식으로 구문 분석하는 방법이 있습니까 ?output.txt

0,int, A[4], 0, 16
1,char, B[16], 16,31
2,long int, C[2], 32, 8 

답변1

귀하의 입력은 C와 유사한 것으로 보이므로 이론적으로는 C 파서로 구문 분석하는 것이 더 나을 것입니다. 정규식을 사용하는 경우 간단한 작업에도 다양한 공백, 여러 줄 입력 등을 처리해야 합니다. 문제는 C 파서가 주석을 구문 분석하지 않으며 분명히 그렇게 하길 원한다는 것입니다.

다음은 샘플에 대한 예상 출력을 제공하는 Perl 스크립트입니다.

#!/usr/bin/perl -n
#
BEGIN { $i = 0; }

if (m!^\s*(.+)\s+([^ ]+);\s*/\*\s*(\d+)\s*(\d+)\s*\*/\s*$!)
{
    print "$i,$1,$2,$3,$4\n";
    $i+=1
}

script.pl이 스크립트를 is 폴더에 저장하는 경우 input.txt다음과 같이 사용하십시오.

./script.pl < input.txt > output.txt

답변2

정규 표현식이 없는 awk 대안:

$ echo "int A[4];   /* 0  16*/" |awk '{gsub(/[/*;]/,"");for (i=1;i<=NF;i++) printf("%s, %s", (i==1?NR-1:""),(i==NF?$i"\n":$i))}'
#Output:
0, int, A[4], 0, 16

함정:

$ echo "long int C[2]; /*32  8*/" |awk '{gsub(/[/*;]/,"");for (i=1;i<=NF;i++) printf("%s, %s", (i==1?NR-1:""),(i==NF?$i"\n":$i))}'
#Output
0, long, int, C[2], 32, 8

답변3

perl -lane '
   /^\s*\/\*/ and $,=",",next;
   print $a++,join ", ", grep /./, map { m!^/\*+\K(\S*)|([^*]*)(?=\*+/$)|(.+[^;]);?$! } @F
'

관련 정보