4

Linuxの初心者なので、次の質問があります。ファイルのリスト(今回はsvn statusの結果)があり、それらすべてをループしてタブを4つのスペースに置き換えるスクリプトを作成したいと思います。

だから私は

....
D      HTML/templates/t_bla.tpl
M      HTML/templates/t_list_markt.tpl
M      HTML/templates/t_vip.tpl
M      HTML/templates/upsell.tpl
M      HTML/templates/t_warranty.tpl
M      HTML/templates/top.tpl
A  +   HTML/templates/t_r1.tpl
....

のようなものに

for i in <files>; expand -t4;do cp $i /tmp/x;expand -t4 /tmp/x > $i;done;

しかし、私はそれを行う方法がわかりません...

4

5 に答える 5

16

次のコマンドを使用できます。

svn st | cut -c8- | xargs ls

これにより、最初の8文字がカットされ、Subversionフラグなしでファイル名のリストのみが残ります。grepbeforeを追加cutして、などの一部のタイプの変更のみをフィルタリングすることもでき/^M/ます。xargsファイルのリストを引数として指定されたコマンド(lsこの場合)に渡します。

于 2008-11-14T09:46:39.483 に答える
3

私はsedを次のように使用します:

for i in files
do
    sed -i 's/\t/    /' "$i"
done

そこにあるその大きなブロックには4つのスペースがあります。;-)

私はそれをテストしていませんが、動作するはずです。念のため、ファイルをバックアップします。-iフラグは、ファイルをインプレースで置換することを意味しますが、混乱した場合は、ファイルを復元できるようにする必要があります。

これは、$filesにファイル名が含まれていることを前提としています。ただし、ファイル名を取得する際にAdamのアプローチを使用することもできます。「$i」を指定せずに、上記のsedコマンドを使用するだけです。

于 2008-11-14T09:45:56.223 に答える
3

投票は求めていませんが、記録のために、@AdamByrtek@DanFegoからの回答を組み合わせて投稿します。

svn st | cut -c8- | xargs sed -i 's/\t/    /'
于 2008-11-14T10:44:16.140 に答える
2

実際のSubversion出力でテストすることはできませんでしたが、これでうまくいくはずです。

svn st | cut -c8- | while read file; do expand -t4 $file > "$file-temp"; mv "$file-temp" "$file"; done

svn st | cut -c8-Subversionフラグのないファイルのリストを生成します。次に、変数のread各エントリを保存し、各ファイルのタブを4つのスペースに置き換えるために使用されます。$fileexpand

于 2008-11-14T10:14:45.887 に答える
0

あなたが求めているものとはまったく異なりますが、おそらく、Subversion のコミット フックを調べる必要がありますか?

行頭にタブを含むコード、またはタブをまったく含むコードのチェックインをブロックするフックを作成できます。

Subversion サーバーのリポジトリ ディレクトリには、hooks というディレクトリがあります。「pre-commit」と呼ばれる実行可能なものをそこに置くと、何かがコミットされる前に実行されます。必要に応じて、コミットをブロックするステータスを返すことができます。

構文エラーがチェックインされているphpファイルを停止する必要があるのは次のとおりです。

#!/bin/bash
REPOS="$1"
TXN="$2"
PHP="/usr/bin/php"

SVNLOOK=/usr/bin/svnlook

$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" > /dev/null

if [ $? -ne 0 ]
then
  echo 1>&2
  echo "You must enter a comment" 1>&2
  exit 1
fi


CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | awk '{print $2}'`

for LINE in $CHANGED
  do
  FILE=`echo $LINE | egrep \\.php$`
  if [ $? == 0 ]
    then
    MESSAGE=`$SVNLOOK cat -t "$TXN" "$REPOS" "${FILE}" | $PHP -l`
    if [ $? -ne 0 ]
      then
      echo 1>&2
      echo "***********************************" 1>&2
      echo "PHP error in: ${FILE}:" 1>&2
      echo "$MESSAGE" | sed "s| -| $FILE|g" 1>&2
      echo "***********************************" 1>&2
      exit 1
    fi
  fi
done
于 2008-11-14T11:58:24.850 に答える