如何在文本文件中按行号替换特定行?

时间:2009-03-31 23:18:49

标签: linux

我的linux机箱上有一个2GB的文本文件,我正试图导入我的数据库。

我遇到的问题是处理这个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>
=^

我想将</Topic>替换为</Line>。我不能在所有行上搜索/替换,但我确实有行号,所以我希望有一些简单的方法可以用新文本替换那一行。

有任何想法/建议吗?

5 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:8)

sed -i '25462599 s|</Topic>|</Line>|' nameoffile.txt

答案 2 :(得分:6)

在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是标准化的,而-i的{​​{1}}标志是专有的GNU扩展,很多系统都没有。

答案 3 :(得分:2)

使用“head”获取前25462598行并使用“tail”获取剩余行(从25462601开始)。虽然......对于2GB的文件,这可能需要一段时间。

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

答案 4 :(得分:1)

我的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

此脚本将输出打印到stdout,然后您需要重定向。例如:

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

例如,您可以通过注意所有参数都具有预期值来改进它。