私は不必要な空白、空行を取り除き、括弧をそれらの間にスペースでバランスさせることでコードを改良しようとしています。
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
また、このスクリプトをより簡潔にする方法はありますか?コマンドの数を削除または削減しますか?
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).
先に進む必要があります+
とともに \
、それ以外の場合、sed
は+
自体。
スクリプトをよりスマートにするために、すべての式を1つのsedに蓄積できます。
sed -e 's/((/( (/g' -e 's/))/) )/g' -e 's/ \+/ /g' -e '/^$/d' $filename > new.txt
sed
の一部の実装では、-i
ファイルの変更を有効にするオプションin place。
場合によっては、-rおよび-eが機能しないことがあります。 sedバージョン4.2.1を使用していますが、まったく機能しません。
簡単なハックは、代わりに*演算子を使用することです。したがって、すべての冗長なスペース文字を単一のスペースに置き換えたいとしましょう。
sed 's/ +/ /'
ただし、代わりにこれを使用できます。
sed 's/ */ /'
(二重スペースに注意してください)
最もクリーンなソリューションではない場合があります。ただし、-E
および-r
sedの両方のバージョンと互換性を保つために、繰り返し文字cc*
-それは1 c
で0以上c
の==
1つ以上のc
。
または、 @ cdarke で示唆されているように、BRE構文を使用して特定の番号またはパターンに一致するc\{1,\}
。コンマの後の2番目の数字は、1以上を意味するために除外されます。
バッシュの前面に;
まず、スクリプト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
これはあなたのために働くかもしれません:
sed -e '/^$/d' -e ':a' -e 's/\([()]\)\1/\1 \1/g' -e 'ta' -e 's/ */ /g' $filename >new.txt