Unix 스크립트를 사용하여 여러 줄의 if 문을 한 줄의 if 문으로 변환하는 방법은 무엇입니까? [폐쇄]

Unix 스크립트를 사용하여 여러 줄의 if 문을 한 줄의 if 문으로 변환하는 방법은 무엇입니까? [폐쇄]

파일에는 다음과 같은 조건이 여러 개 있습니다.

if ( a==b ||
c!=d &&
(e>f))
{
do something
}

여러 줄의 if 문을 한 줄의 if 문으로 변환해야 합니다. 즉,

if ( a==b || c!=d && (e>f))
{
do something
}

Unix 스크립트를 사용하여 이 변환을 어떻게 수행할 수 있습니까?

답변1

들여쓰기 도구(예: indent또는 ) 를 통해 실행합니다 clang-format. C 및 C++ 구문 규칙을 이해하고 구성 방법에 따라 코드 형식을 다시 지정합니다. clang-format심지어 clang컴파일러와 동일한 언어 파서를 사용합니다.

예를 들어:

$ cat test.c
if ( a==b ||
c!=d &&
(e>f))
{
/* do something */
}

$ clang-format test.c
if (a == b || c != d && (e > f)) {
  /* do something */
}

$ clang-format --style="{BreakBeforeBraces: Allman}" test.c
if (a == b || c != d && (e > f))
{
  /* do something */
}

$ indent -kr -st <test.c
if (a == b || c != d && (e > f)) {
/* do something */
}

$ indent -kr -bl -st < test.c
if (a == b || c != d && (e > f))
{
/* do something */
}

indentindent위의 예에서는 BSD 시스템의 기본값 대신 GNU를 사용합니다 .indent

답변2

이는 다음을 사용하여 수행할 수 있습니다 awk.

awk '(/^\{/ || flag)&&/^[^}]/{printf "\n%s",$0;flag=1} 
      /^\}/{flag=0; printf "\n}\n" ;next} 
     (!flag){printf "%s ",$0}' infile.txt

관련 정보