Я хочу исправить каждую строку в Текстовом файле с помощью sed или альтернативном решении

Я хочу исправить каждую строку в Текстовом файле с помощью sed или альтернативном решении

input.txt, содержащий

line 1
line 2 
line 3 
...

output.txt должен добавить две строки и

<before> line 1 and <after each line>
<before> line 2 and <after each line>
<before> line 3 and <after each line>
...

Я могу использовать sed или что-то еще?

4
задан 9 September 2017 в 12:49

6 ответов

С помощью sed:

sed 's/.*/<before> & and <after each line>/' input.txt > output.txt

Пояснения

  • s/x/y/ - заменить x на y
  • .* - взять всю строку
  • & - получить соответствующий текст

Остальное - это просто текст, который вы хотите добавить до и после &.

9
ответ дан 23 November 2019 в 11:34

Вы также можете использовать coreutils:

n=$(wc -l < infile)
paste -d '' <(yes '<before>' | head -n $n) \
            infile                         \
            <(yes '</after>' | head -n $n)

Вывод:

<before>line 1</after>
<before>line 2</after>
<before>line 3</after>
4
ответ дан 23 November 2019 в 11:34

С помощью vi / vim / ex вы можете написать для этого неинтерактивный однострочный текст или сделать это в открытом редакторе.

Вы можете использовать любую из этих команд из вашей оболочки. Они открывают редактор, добавляют текст в начало и конец каждой строки, сохраняют файл с другим именем файла и выходят из редактора:

ex in.txt '+%s/.*/<before> & and <after each line>/' '+wq out.txt'
vi in.txt '+%s/.*/<before> & and <after each line>/' '+wq! out.txt'

Первая команда использует режим ex и wq достаточно, чтобы сохранить буфер как out.txt и выйти. Вторая команда использует режим vi и, поскольку измененный буфер все еще открыт и не был сохранен в исходном файле , требуется версия команды !.

Вторая команда также работает в режиме ex (и с vim вместо vi), но нет причин избегать ex для однострочников. Реальная причина, по которой я показываю версию vi, что вы можете использовать ее с : вместо + в каждой команде, чтобы выполнить изменение в интерактивном режиме при интерактивном редактировании в vi или vim.

С помощью in.txt, открытого в редакторе (vim in.txt), вы можете запустить:

:%s/.*/<before> & and <after each line>/
:wq! out.txt

Независимо от того, используете ли вы неинтерактивную или интерактивную версию, они работают одинаково. vi и vim (и многие другие текстовые редакторы из «семейства vi») поддерживают поиск и заменяют синтаксис, подобный sed. Вы заметите сходство с методом sed в ответе десерта :

  • .* - это регулярное выражение, которое соответствует любому символу (.) ноль или более раз (*), что соответствует целой строке.
  • & означает весь матч.
  • s/pattern/replacement/ заменяет первое вхождение pattern на строку с replacement .

sed автоматически применяет свой сценарий к каждой строке . vi / vim / ex дает вам более детальный контроль. %s выполняет действие поиска и замены (s) для всех строк (%) и также может быть записано 1,$s. Если вы хотите изменить только одну строку, вы можете написать что-то вроде 3s (только третья строка). Точно так же вы можете изменить любой диапазон строк, например, 3,10s для строк с третьей по десятую или 10,$s для десятой и всех строк с более высокими номерами.

4
ответ дан 23 November 2019 в 11:34

С awk и sed

awk 'NF' input.txt | sed -r 's/(.*)/<before> \1 and <after line>/' > out.txt

Объяснение:

  1. awk команда удаляет пустые строки и передает вывод по каналу к sed

  2. sed получения каждая строка и добавляет необходимые тексты прежде и после возвращенного значения \1 и перенаправляет к out.txt файл

2
ответ дан 23 November 2019 в 11:34

С awk:

awk '{print before, $0, after}' before="<before>" after="and <after each line" input.txt > output.txt

Это просто печатает содержание переменной before, $0 (текущая строка) и переменная after, разделенный пробелами. Переменные установлены после awk выражения.

8
ответ дан 23 November 2019 в 11:34

С perl:

perl -ne 'chomp; print "<before> $_ and <after each line>\n"' in.txt > out.txt

Эти изменения могли бы быть полезными:

  • Замена <before> и and <after each line> с чем Вы на самом деле хотите добавить.
  • Удалить > out.txt отправить вывод на Ваш терминал, а не на файл.
  • Можно удалить входное имя файла (in.txt) ввести вход в интерактивном режиме для тестирования.

Как это работает:

  • -p делает Perl interpeter, воздействуют на каждую строку (см. perldoc perlrun или man perlrun).
  • -e заставляет следующий аргумент быть сценарием жемчуга. Так часть в ' ' код Perl.
  • chomp удаляет разделитель строки (новая строка) в конце каждой строки perl получает.
  • " " заключенная в кавычки строковая интерполяция поддержки. $_ чтение строки. \n символ новой строки.
  • perl будет использовать in.txt как входной файл. > в > out.txt говорит Вашей оболочке перенаправлять вывод.

Эта команда имеет тот же эффект с тех пор -p (в отличие от этого, -n) автоматически печать каждая строка ($_):

perl -pe 'chomp; $_ = "<before> $_ and <after each line>\n"' in.txt > out.txt

Существуют больше sed- как способы использовать perl. Одним преимуществом путей, показанных здесь, является удобочитаемость.

5
ответ дан 23 November 2019 в 11:34

Другие вопросы по тегам:

Похожие вопросы: