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

Posted

技术标签:

【中文标题】如何在文本文件中逐行替换特定行?【英文标题】:How can I replace a specific line by line number in a text file? 【发布时间】:2010-10-16 18:00:49 【问题描述】:

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

我想用&lt;/Line&gt; 替换&lt;/Topic&gt;。我无法对所有行进行搜索/替换,但我确实有行号,所以我希望有一些简单的方法可以用新文本替换那一行。

有什么想法/建议吗?

【问题讨论】:

【参考方案1】:
sed -i '25462599 s|</Topic>|</Line>|' nameoffile.txt

【讨论】:

【参考方案2】:
sed -i yourfile.xml -e '25462599s!</Topic>!</Line>!'

【讨论】:

【参考方案3】:

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

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

【讨论】:

行标签是自动关闭的,所以额外的必须在其他地方开始...... 这让我看起来,它实际上是我需要替换的 ExternalPage。谢谢!【参考方案4】:

在 Unix 中编辑文本文件的工具称为ed(与sed相对,顾名思义是流编辑器)。

ed 曾经打算用作交互式编辑器,但它也可以轻松编写脚本。 ed 的工作方式是所有命令都采用地址参数。寻址特定行的方法只是行号,更改寻址行的方法是s 命令,它采用与sed 相同的正则表达式。因此,要更改第 42 行,您可以编写类似 42s/old/new/ 的内容。

这是整个命令:

FILENAME=/path/to/whereever
LINENUMBER=25462599

ed -- "$FILENAME" <<-HERE
    $LINENUMBERs!</Topic>!</Line>!
    w
    q
HERE

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

以上是关于如何在文本文件中逐行替换特定行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中逐行读取文本文件并分隔每一行的内容?

在Swift中逐行读取文本文件?

如何从 C++ 中的文本文件中逐行读取整数? [复制]

在 VBA 中逐行读取/解析文本文件

在 C 中逐行浏览文本文件

Objective C - 创建文本文件以在 Cocoa 中逐行读取和写入