Добавить строку префикса в начало каждой строки
у меня есть файл, как показано ниже:
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
я процитировал разделитель 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