私はコードを持っています:
1 /**
2 a b c
3 **/
4 int main() {
5 int x;
6 if ( condition) {
7 return x;
8 }
9 }
行7と同様に、トークンまたは文字列の間の複数のスペースを単一のスペースに変更する必要がありますが、コメント(行2)またはコードの前のタブは影響を受けてはいけません。したがって、出力は次のようになります。
1 /**
2 a b c
3 **/
4 int main() {
5 int x;
6 if ( condition) {
7 return x;
8 }
9 }
'tr'を試しましたが、~$ tr -s " " < file
2行が変更され、5行から8行から先行タブ文字が削除されました。を使用して実行できますかsed
?
ベストアンサー1
どのくらい行くのでしょうか?
sed -rn '\#/\*\*#,\#\*\/*# {p;b}; s/([^ ]) +/\1 /g; p' file
わかりますか?変更されていないコメント行を印刷し(ただし、同じ行のコメントのオン/オフを処理できない)、スクリプトの残りの部分をスキップします。コメントアウトされていない行の場合は、空白以外の文字に続く複数の空白(したがって範囲外の行のインデント)を単一の空白に圧縮します。