ファイルには次の条件がいくつかあります。
if ( a==b ||
c!=d &&
(e>f))
{
do something
}
複数行のifステートメントを1行の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 */
}
indent
indent
上記の例では、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