Я хочу изменить каждую строку в текстовом файле с помощью 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 в 22:49

10 ответов

С помощью 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. Вы заметите сходство с vi / vim / ex :

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

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

4
ответ дан 18 July 2018 в 07:08

С awk и sed

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

Объяснение: команда

awk удаляет пустые строки и каналы, выходные данные на sed sed захватывают каждый и добавляет необходимые тексты до и после возвращаемого значения \1 и перенаправляет выход в out.txt файл
2
ответ дан 18 July 2018 в 07:08

С awk:

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

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

8
ответ дан 18 July 2018 в 07:08

Вы также можете использовать 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
ответ дан 18 July 2018 в 07:08

С sed:

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

Объяснения

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

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

8
ответ дан 18 July 2018 в 07:08

С помощью 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. Вы заметите сходство с vi / vim / ex :

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

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

4
ответ дан 24 July 2018 в 18:44

С awk и sed

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

Объяснение: команда

awk удаляет пустые строки и каналы, выходные данные на sed sed захватывают каждый и добавляет необходимые тексты до и после возвращаемого значения \1 и перенаправляет выход в out.txt файл
2
ответ дан 24 July 2018 в 18:44

С awk:

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

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

8
ответ дан 24 July 2018 в 18:44

Вы также можете использовать 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
ответ дан 24 July 2018 в 18:44

С sed:

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

Объяснения

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

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

8
ответ дан 24 July 2018 в 18:44
  • 1
    Вы можете использовать только .* без группы, а затем &, чтобы получить полный текст. – muru 9 September 2017 в 23:06
  • 2
    @muru Спасибо, я не знал! – dessert 9 September 2017 в 23:15
  • 3
    @ConfluentesInfo вы должны принять этот ответ в этом случае. См. [D0] askubuntu.com/help/someone-answers – muru 11 September 2017 в 05:18

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

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