web-dev-qa-db-ja.com

「+」(1つ以上のオカレンス)が「sed」コマンドで機能しない

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

    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

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

56
Siddhartha

GNU sedを使用している場合は、sed -rを使用する必要があります。これにより、+の必要な動作を含め、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).
65
Sicco

先に進む必要があります+ とともに \、それ以外の場合、sed+自体。

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

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

sedの一部の実装では、-iファイルの変更を有効にするオプションin place

13
choroba

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

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

sed 's/ +/ /'

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

sed 's/  */ /'

(二重スペースに注意してください)

9
statueofmike

最もクリーンなソリューションではない場合があります。ただし、-Eおよび-r sedの両方のバージョンと互換性を保つために、繰り返し文字cc*-それは1 cで0以上c== 1つ以上のc

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

3
dosentmatter

バッシュの前面に;

まず、スクリプトtest.shを作成しました

猫test.sh

#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "Text read from file: $line"
    SRC=`echo $line | awk '{print $1}'`
    DEST=`echo $line | awk '{print $2}'`
    echo "moving $SRC to $DEST"
    mv $SRC $DEST || echo "move $SRC to $DEST failed" && exit 1
done < "$1"

次に、データファイルとテストファイルaaa.txtを作成します

cat aaa.txt
<tag1>19</tag1>
<tag2>2</tag2>
<tag3>-12</tag3>
<tag4>37</tag4>
<tag5>-41</tag5>

次に、テストして結果を表示します。

bash test.sh list.txt 
Text read from file: aaa.txt bbb.txt
moving aaa.txt to bbb.txt
1
Calvin Taylor

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

sed -e '/^$/d' -e ':a' -e 's/\([()]\)\1/\1 \1/g' -e 'ta' -e 's/  */ /g' $filename >new.txt
1
potong