Como converter uma instrução multiline if para uma única linha se a instrução usar script unix? [fechadas]

0

Em um arquivo, tenho várias condições if, como abaixo:

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

Eu tenho que converter cada linha multilinha, se declaração, para linha única, se declaração, ou seja,

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

Como posso fazer essa conversão usando o script Unix?

    
por Ayush Malik 20.08.2017 / 12:06

2 respostas

4

Execute-o por meio de uma ferramenta de recuo, como indent ou clang-format . Eles conhecem as regras gramaticais C e C ++ e reformatarão seu código de acordo com a forma como você as configura. clang-format está mesmo usando o mesmo analisador de linguagem que o compilador clang .

Por exemplo:

$ 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 */
}

O indent usado no exemplo acima é GNU indent , não o padrão indent encontrado nos sistemas BSD.

    
por 20.08.2017 / 12:18
0

Pode ser feito com awk :

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