Как заменить конкретную строку на номер строки в текстовом файле? - PullRequest
5 голосов
/ 01 апреля 2009

У меня есть текстовый файл объемом 2 ГБ на моем компьютере с 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>
=^

Я хочу заменить </Topic> на </Line>. Я не могу выполнить поиск / замену по всем строкам, но у меня есть номер строки, поэтому я надеюсь, что есть простой способ заменить эту строку новым текстом.

Есть идеи / предложения?

Ответы [ 5 ]

11 голосов
/ 01 апреля 2009
sed -i yourfile.xml -e '25462599s!</Topic>!</Line>!'
8 голосов
/ 01 апреля 2009
sed -i '25462599 s|</Topic>|</Line>|' nameoffile.txt
6 голосов
/ 01 апреля 2009

Инструмент для редактирования текста файлов в 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 для sed является проприетарным расширением GNU, которое недоступно во многих системах.

2 голосов
/ 01 апреля 2009

Используйте «голову», чтобы получить первые 25462598 строк, и «хвост», чтобы получить оставшиеся строки (начиная с 25462601). Хотя ... для файла 2 ГБ это, вероятно, займет некоторое время.

Также вы уверены, что проблема именно с этой строкой, а не где-то предыдущей (т. Е. Ошибка выглядит как ошибка синтаксического анализа XML, что может означать, что настоящая проблема в другом месте).

1 голос
/ 01 апреля 2009

Мой сценарий оболочки:

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

Вы можете улучшить его, например, позаботившись о том, чтобы все ваши аргументы имели ожидаемые значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...