Добавить строку префикса в начало каждой строки

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

line1
line2
line3

и я хочу к вам:

prefixline1
prefixline2
prefixline3

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

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

9 ответов


sed -e 's/^/prefix/' file

# 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, или побег /, Так что становится

's#^#/opt/workdir#'
# or
's/^/\/opt\/workdir/'

awk '="prefix"' file > new_file

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

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

  2. s заменить

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


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

prefix=path/to/file/

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

awk -v prefix="$prefix" '{print prefix }' input_file.txt

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

perl -pe 's/^/PREFIX/' input.file

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

#!/bin/bash
prefix="something"
file="file"
while read -r line
do
 echo "${prefix}$line"
done <$file > newfile
mv newfile $file

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

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

было несколько проблем с использованием nl, хотя, связанные с желанием удалить ненужные номера строк (даже если вы не заботитесь об эстетике этого, могут быть случаи, когда использование дополнительных столбцов было бы нежелательным). Во-первых, использование "cut" для удаления чисел повторно вводит проблему буферизации, поэтому она разрушает решение. Во-вторых, использование "- 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}

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

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

это заменяет, для каждой строки (,), начало строки (^) С prefix. wq сохраняет и выходит.

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

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

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


вот завернутый пример использования sed подход ответ:

$ cat /path/to/some/file | prefix_lines "WOW: "

WOW: some text
WOW: another line
WOW: more text

prefix_lines

function show_help()
{
  IT=$(CAT <<EOF
    Usage: PREFIX {FILE}

    e.g.

    cat /path/to/file | prefix_lines "WOW: "

      WOW: some text
      WOW: another line
      WOW: more text
  )
  echo "$IT"
  exit
}

# Require a prefix
if [ -z "" ]
then
  show_help
fi

# Check if input is from stdin or a file
FILE=
if [ -z "" ]
then
  # If no stdin exists
  if [ -t 0 ]; then
    show_help
  fi
  FILE=/dev/stdin
fi

# Now prefix the output
PREFIX=
sed -e "s/^/$PREFIX/" $FILE