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或将其替换为文件的路径运行这两行,它应该可以工作。

于 2012-07-18T21:25:34.810 回答