0

現在、あるSVNサーバーのコンテンツを別のサーバーに移行中です。簡単に言えば、dos2unixいくつかの行末を変換するために使用しようとしましたが、何も修正せずにリビジョンログのかなりの部分をいじってしまいました。svnadmin不正な形式のファイルエラーのため、を使用して完全なダンプファイルを作成できません。ファイルは次のように構成されています。

K (# of chars in following line)
svn:author
V (# of chars in following line)
(author)
K ##
svn:date
V ## 
(date)
K ##
svn:log
V (# of chars in following lines)
revision
commit
text
END

エラーは、最後の数字に続く番号Vが正しくないことに起因します。これまで私は手動で番号を変更してきました。これには、テキストのコピー、どこかの文字のカウント、番号の変更、保存、そしてsvnadmin dump DIR > dumpfile.dmp次の文字を見つけるための実行が含まれます。私は一般的には気にしませんが、コマンドの実行にはsvnadmin dump少し時間がかかり、多くのコマンドを実行することになります。

私の質問はこれです:12行目から「END」の前の行の終わりまでの文字数をカウントし、11行目の数を置き換えるスクリプトを作成する方法はありますか?私はUNIXに比較的慣れておらず、awk、sedなどを調査しましたが、十分なものは見つかりませんでした。それらはかなりユニークなパラメータであると私は理解しているので、役立つものは何でも歓迎です。文字数と文字数が一致しないファイルを一覧表示する方法はありますか?それは私の仕事を大幅にスピードアップするでしょう。

ありがとう。

e:つづり

4

2 に答える 2

0

次のスクリプトが役立ちます。

#!/bin/bash

# Print from line 12 to the end of the file
#   sed -n '12,$p' < $1 
#
# Then count the number of chars in those lines with 
#   wc -c 
#
# Later we take the number of chars in $NUM_CHARS and substract 4 from it 
# (the char count in the "END\n" token, assuming if has a line-end char, if not
# change 4 by 3) with
#   xargs -i expr {} - 4
NUM_CHARS=$(sed -n '12,$p' < $1 | wc -c | xargs -i expr {} - 4)

# Modify the line 11 in file 
sed "11 c\ $NUM_CHARS" $1  

このコードをファイル「script.sh」に保存し、実行権限を付与して、次のように実行します。

./script.sh input_file

新しく生成されたファイルの内容を別のファイルに保存するには、上記のスクリプトを次のように実行します。

./script.sh input_file > new_file

元のファイルで置換を行う前に、それが必要かどうかを確認してください

于 2012-07-18T20:46:09.230 に答える
0

別のバージョンは次のとおりです。

file='path/to/file'
sed -i'' -e"11 s/\d+/$(expr $(tail -n+12 $file | wc -m) - 3)/" $file

また

sed -i'' -e"11 s/\d+/$(expr $(tail -n+12 /path/file | wc -m) - 3)/" /path/file

最初に宣言するか$file、ファイルへのパスに置き換える必要があります。これらの2行を実行すると、機能するはずです。

于 2012-07-18T21:25:34.810 に答える