86

不要な空白や空行を取り除き、括弧とその間のスペースのバランスをとることで、コードを改良しようとしています。

    int a = 4;
    if ((a==4) ||   (b==5))

    a++   ;

次のように変更する必要があります。

    int a = 4;
    if ( (a==4) || (b==5) )
    a++ ;

括弧と空行でも機能します。ただし、複数のスペースを 1 つのスペースに減らすのを忘れています。

    int a = 4;
    if ( (a==4) ||   (b==5) )
    a++    ;

これが私のスクリプトです:

    #!/bin/bash
    # Script to refine code
    #
    filename=read.txt

    sed 's/((/( (/g' $filename > new.txt
    mv new.txt $filename

    sed 's/))/) )/g' $filename > new.txt
    mv new.txt $filename

    sed 's/ +/ /g' $filename > new.txt
    mv new.txt $filename

    sed '/^$/d' $filename > new.txt
    mv new.txt $filename

また、コマンドの数を削除または削減するなど、このスクリプトをより簡潔にする方法はありますか?

4

6 に答える 6

95

GNU sedを使用している場合は、の必要な動作を含め、拡張された正規表現を使用するために、 sed -rwhich forceを使用する必要があります。参照:sed+man sed

-r, --regexp-extended

       use extended regular expressions in the script.

OS X sedを使用している場合も同じですが、次を使用する必要がありますsed -E

-E      Interpret regular expressions as extended (modern) regular expressions
        rather than basic regular regular expressions (BRE's).
于 2012-08-23T23:44:07.660 に答える
20

を前に付ける必要+があります。\それ以外の場合は、文字自体sedに一致させようとします。+

スクリプトを「よりスマート」にするために、すべての式を 1 つの sed に蓄積できます。

sed -e 's/((/( (/g' -e 's/))/) )/g' -e 's/ \+/ /g' -e '/^$/d' $filename > new.txt

sedevenの一部の実装では、ファイルをその場で-i変更できるようにするオプションがサポートされています。

于 2012-08-23T23:41:11.387 に答える
12

-r と -e が機能しない場合があります。私は sed バージョン 4.2.1 を使用していますが、まったく機能しません。

簡単なハックは、代わりに * 演算子を使用することです。では、冗長なスペース文字をすべて単一のスペースに置き換えたいとしましょう:

sed 's/ +/ /'

しかし、代わりにこれを使用できます。

sed 's/  */ /'

(ダブルスペースに注意してください)

于 2013-03-14T02:55:06.600 に答える
4

最もクリーンなソリューションではない可能性があります。-Eしかし、回避し-rて両方のバージョンの sed との互換性を維持したい場合は、繰り返し文字を実行できます。cc*つまり、1 のc次に 0 以上c==1以上の文字cです。

または、 @cdarkeで提案されているように、BRE 構文を使用して、特定の番号またはパターンに一致させますc\{1,\}。コンマの後の 2 番目の数字は、1 以上を意味するために除外されます。

于 2018-02-28T10:25:47.517 に答える
1

これはあなたのために働くかもしれません:

sed -e '/^$/d' -e ':a' -e 's/\([()]\)\1/\1 \1/g' -e 'ta' -e 's/  */ /g' $filename >new.txt
于 2012-08-24T05:55:50.360 に答える