Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Svn UNIX:计算行号和字符串之间的字符数_Svn_Unix - Fatal编程技术网

Svn UNIX:计算行号和字符串之间的字符数

Svn UNIX:计算行号和字符串之间的字符数,svn,unix,Svn,Unix,我目前正在将一台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

我目前正在将一台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
命令需要一点时间,而且我会经常运行它

我的问题是:有没有办法编写一个脚本,在“end”之前计算从第12行到行尾的字符数,然后替换第11行的字符数?我对unix比较陌生,已经研究过awk、sed等,但还没有发现足够的东西。我意识到这些是非常独特的参数,所以任何有帮助的都是受欢迎的。是否有办法列出字符数和数字不匹配的文件?这将大大加快我的工作速度

谢谢


e:拼写

以下脚本应该有帮助:

#!/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 input_file > new_file

在对原始文件进行任何替换之前,请检查是否符合您的要求,这是另一个版本:

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

您需要首先声明
$file
,或者用文件路径替换它
运行这两行,它应该会工作。

结束
标记后是否会有另一个文本/单词?不,后面什么都没有。这是每个文件中的最后一件事。你能覆盖文件第11行的内容吗?我有权限吗?对文件是否可编辑?是的,否则我会陷入众所周知的困境哈。对不起,我没有正确解释,我的意思是如果你能覆盖这行或者如果你必须插入一个新的行?嘿,那太好了!有一个问题(我要再次强调,我对unix比较陌生),当我执行
/script
命令时,它无法识别该文件。我做了
/script.sh
,效果很好。但是,虽然它打印正确的数字(我也将-4更改为-5),但实际上并没有更改文件。它肯定有执行权限。你知道为什么吗?对不起,这是一个打字错误,事实上,你必须写
/script.sh
(我会编辑答案)。要更改文件,必须首先将脚本输出保存到一个新文件
/script.sh input\u file>new\u file
,因为如果您使用相同的输入文件,例如:
/script.sh input\u file>input\u file
,您将得到一个空文件(可以找到对此的解释)。但是,您可以在新版本的
sed
中使用
-i
选项,这样就不用担心了。我想知道这个新文件的功能,但它在其他方面工作得很好,所以我认为它不值得一提。这个解释很好,谢谢。我想投你的票,但我还不能;没什么私事。谢谢,别担心,很高兴它有帮助!
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