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

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

line1
line2
line3

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

prefixline1
prefixline2
prefixline3

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

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

Ответ 1

# 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 в prefix, или экранировать /, поэтому команда sed становится

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

Ответ 2

awk '$0="prefix"$0' file > new_file

Ответ 3

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

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

  • s заменить

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

Ответ 4

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

prefix=path/to/file/

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

В то время как я не думаю, что у 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}

Ответ 8

Используя ed:

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

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

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

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

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

Ответ 9

Вот пример завершен с использованием 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 "$1" ]
then
  show_help
fi

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

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

Ответ 10

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

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

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

Ответ 11

Вот хорошо читаемое решение 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

Ответ 12

Пожалуйста, используйте следующую команду

SED заменит начало префиксом.

sed "%%% префикс%" файл