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