Я хочу исправить каждую строку в Текстовом файле с помощью 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 или что-то еще?
С помощью sed:
sed 's/.*/<before> & and <after each line>/' input.txt > output.txt
s/x/y/
- заменить x на y .*
- взять всю строку &
- получить соответствующий текст Остальное - это просто текст, который вы хотите добавить до и после &
.
Вы также можете использовать 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>
С помощью 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
для десятой и всех строк с более высокими номерами.
С awk
и sed
awk 'NF' input.txt | sed -r 's/(.*)/<before> \1 and <after line>/' > out.txt
Объяснение:
awk
команда удаляет пустые строки и передает вывод по каналу к sed
sed
получения каждая строка и добавляет необходимые тексты прежде и после возвращенного значения \1
и перенаправляет к out.txt
файл
С awk:
awk '{print before, $0, after}' before="<before>" after="and <after each line" input.txt > output.txt
Это просто печатает содержание переменной before
, $0
(текущая строка) и переменная after
, разделенный пробелами. Переменные установлены после awk выражения.
С 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
. Одним преимуществом путей, показанных здесь, является удобочитаемость.