Добавьте строку префикса в начало каждой строки
у меня есть файл, как показано ниже:
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/'
вы можете использовать Vim в режиме Ex:
ex -sc '%s/^/prefix/|x' file
%
выбрать все строки
s
заменить
x
сохранить и закрыть
Если ваш префикс немного сложный, просто поместите его в переменную:
prefix=path/to/file/
затем вы передаете эту переменную и позволяете awk справиться с ней:
awk -v prefix="$prefix" '{print prefix }' input_file.txt
С помощью командной консоли:
#!/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
я процитировал здесь-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