Добавить строку префикса в начало каждой строки - PullRequest
291 голосов
/ 20 января 2010

У меня есть файл, как показано ниже:

line1
line2
line3

И я хочу получить:

prefixline1
prefixline2
prefixline3

Я мог бы написать скрипт на Ruby, но лучше, если мне это не нужно.

prefix будет содержать /. Это путь, например /opt/workdir/.

Ответы [ 11 ]

457 голосов
/ 20 января 2010
# If you want to edit the file in-place
sed -i -e 's/^/prefix/' file

# If you want to create a new file
sed -e 's/^/prefix/' file > file.new

Если prefix содержит /, вы можете использовать любой другой символ, кроме prefix, или экранируйте /, поэтому команда sed становится

's#^#/opt/workdir#'
# or
's/^/\/opt\/workdir/'
111 голосов
/ 20 января 2010
awk '$0="prefix"$0' file > new_file

С Perl (на месте замены):

perl -pi 's/^/prefix/' file
30 голосов
/ 30 сентября 2012

Вы можете использовать Vim в режиме Ex:

ex -sc '%s/^/prefix/|x' file
  1. % выбрать все строки

  2. s заменить

  3. x сохранить и закрыть

19 голосов
/ 18 февраля 2015

Если ваш префикс немного сложен, просто поместите его в переменную:

prefix=path/to/file/

Затем вы передаете эту переменную и позволяете awk справиться с ней:

awk -v prefix="$prefix" '{print prefix $0}' input_file.txt
9 голосов
/ 12 декабря 2013

Если у вас есть Perl:

perl -pe 's/^/PREFIX/' input.file
5 голосов
/ 20 января 2010

Использование оболочки:

#!/bin/bash
prefix="something"
file="file"
while read -r line
do
 echo "${prefix}$line"
done <$file > newfile
mv newfile $file
2 голосов
/ 19 апреля 2019

Вот хорошо читаемое решение oneliner, использующее команду ts из moreutils

$ cat file | ts prefix | tr -d ' '

И как это происходит шаг за шагом:

# Step 0. create the file

$ cat file
line1
line2
line3
# Step 1. add prefix to the beginning of each line

$ cat file | ts prefix
prefix line1
prefix line2
prefix line3
# Step 2. remove spaces in the middle

$ cat file | ts prefix | tr -d ' '
prefixline1
prefixline2
prefixline3
2 голосов
/ 08 марта 2014

Хотя я не думаю, что у Pierr была такая проблема, мне нужно было решение, которое не задерживало бы вывод из живого «хвоста» файла, так как я хотел отслеживать несколько журналов предупреждений одновременно, добавляя к каждой строке префикс с именемсоответствующий журнал.

К сожалению, sed, cut и т. д. слишком много буферизировали и мешали мне видеть самые последние строки.Предложение Стивена Пенни использовать -s параметр nl было интригующим, и тестирование показало, что оно не вводило нежелательную буферизацию, которая меня беспокоила.

Было несколько проблем с использованием nl,хотя это связано с желанием убрать ненужные номера строк (даже если вы не заботитесь об их эстетике, могут быть случаи, когда использование дополнительных столбцов было бы нежелательным).Во-первых, использование «вырезать» для удаления чисел вновь вводит проблему буферизации, так что это разрушает решение.Во-вторых, использование «-w1» не помогает, поскольку это НЕ ограничивает номер строки одним столбцом - оно становится шире, когда требуется больше цифр.

Это не очень красиво, если вы хотитезахватите это в другом месте, но так как это именно то, что мне не нужно было делать (все уже писалось для файлов журнала, я просто хотел посмотреть несколько одновременно в режиме реального времени), лучший способ потерять номера строк и иметь толькоМой префикс должен был начинать строку -s с возврата каретки (CR или ^ M или Ctrl-M).Так, например:

#!/bin/ksh

# Monitor the widget, framas, and dweezil
# log files until the operator hits <enter>
# to end monitoring.

PGRP=$$

for LOGFILE in widget framas dweezil
do
(
    tail -f $LOGFILE 2>&1 |
    nl -s"^M${LOGFILE}>  "
) &
sleep 1
done

read KILLEM

kill -- -${PGRP}
1 голос
/ 28 июня 2018

Использование ed:

ed infile <<'EOE'
,s/^/prefix/
wq
EOE

Заменяет для каждой строки (,) начало строки (^) на prefix.wq сохраняет и завершает работу.

Если строка замены содержит косую черту, вместо s можно использовать другой разделитель:

ed infile <<'EOE'
,s#^#/opt/workdir/#
wq
EOE

Я цитировал здесь-документразделитель EOE («конец ed») для предотвращения расширения параметра.В этом примере он также будет работать без кавычек, но рекомендуется избегать неожиданностей, если у вас есть $ в вашем скрипте ed.

0 голосов
/ 19 апреля 2019

Существует стандартная утилита Unix под названием lam, сокращение от ламинат.lam -s prefix file будет делать то, что вы хотите.Я использую его в конвейерах, например:

find -type f -exec lam -s "{}: " "{}" \; | fzf

..., которые найдут все файлы, exec lam на каждом из них, давая каждому файлу префикс своего собственного имени файла.(И накачайте вывод в fzf для поиска.)

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