如何在文本文件中按行号replace特定的行?

我有一个2GB的文本文件,我试图导入到我的数据库的Linux机器上。

我遇到的问题是正在处理这个rdf文件的脚本在一行上窒息:

mismatched tag at line 25462599, column 2, byte 1455502679: <link r:resource="http://www.epuron.de/"/> <link r:resource="http://www.oekoworld.com/"/> </Topic> =^ 

我想用</Line>replace</Topic> </Line> 。 我不能在所有行上进行search/replace,但是我确实有行号,所以我希望能够用一些简单的方法将新文本replace为一行。

任何想法/build议?

Solutions Collecting From Web of "如何在文本文件中按行号replace特定的行?"

 sed -i yourfile.xml -e '25462599s!</Topic>!</Line>!' 
 sed -i '25462599 s|</Topic>|</Line>|' nameoffile.txt 

Unix中用于编辑文本文件的工具称为ed (与sed相反,正如名称所暗示的是流编辑器 )。

ed曾经是一个交互式编辑器,但也可以很容易地编写脚本。 ed工作方式是,所有的命令都有一个地址参数。 解决特定线路的方法只是线路号码,而改变寻址线路的方法是s命令,它采用sed将会使用的相同正则表达式。 所以,要改变第42行,你会写42s/old/new/

这是整个命令:

 FILENAME=/path/to/whereever LINENUMBER=25462599 ed -- "${FILENAME}" <<-HERE ${LINENUMBER}s!</Topic>!</Line>! w q HERE 

这样做的好处是ed是标准化的,而sed-i标志是一个专有的GNU扩展,在很多系统上都不可用。

使用“头”获得第一个25462598线,并使用“尾巴”获得其余的线(从25462601开始)。 虽然…对于2GB的文件,这可能需要一段时间。

你也确定问题只是在那一行,而不是以前的地方(即错误看起来像一个XML解析错误,这可能意味着实际问题是其他地方)。

我的shell脚本:

 #!/bin/bash awk -v line=$1 -v new_content="$2" '{ if (NR == line) { print new_content; } else { print $0; } }' $3 

参数:

 first: line number you want change second: text you want instead original line contents third: file name 

这个脚本打印输出到标准输出然后你需要重定向。 例:

 ./script.sh 5 "New fifth line text!" file.txt 

你可以改进它,例如,注意所有的参数都有预期的值。