У меня есть файл, как показано ниже:
line1
line2
line3
И я хочу получить:
prefixline1
prefixline2
prefixline3
Я мог бы написать скрипт на Ruby, но лучше, если мне это не нужно.
prefix
будет содержать /
. Это путь, /opt/workdir/
например.
linux
scripting
text-processing
pierrotlefou
источник
источник
sed
для легких задач, таких как эта. Если известен «префикс», очень легко выбрать символ, а не из «префикса».sed
в конвейере, напримерfoo | sed -e 's/^/x /' | bar
.sed -e '2,$s/^/prefix/'
./
подобное\/
(в строках в одинарных кавычках) или\\/
(в строках в двойных кавычках)sed -e 's/$/postfix/' file
если вы хотите добавить строку в конец каждой строки.С Perl (на месте замены):
источник
prtinf "$VARIABLE\n" | awk '$0="prefix"$0'
awk
отчетыawk: out of memory in readrec 1 source line number 1
, но решение сsed
успешно завершено.Вы можете использовать Vim в режиме Ex:
%
выбрать все строкиs
замещатьx
сохранить и закрытьисточник
:%s/^/prefix/
, так как эта стратегия оказывается полезной во многих ситуацияхЕсли ваш префикс немного сложен, просто поместите его в переменную:
Затем вы передаете эту переменную и позволяете awk справиться с ней:
источник
Если у вас есть Perl:
источник
Использование оболочки:
источник
Вот хорошо читаемое решение oneliner с использованием
ts
команды moreutilsИ как это происходит шаг за шагом:
источник
Хотя я не думаю, что у Pierr была эта проблема, мне нужно было решение, которое не задерживало бы вывод из живого «хвоста» файла, так как я хотел отслеживать несколько журналов предупреждений одновременно, добавляя в каждую строку имя соответствующего журнала. ,
К сожалению, sed, cut и т. Д. Добавили слишком много буферов и не позволили мне увидеть самые последние строки. Предложение Стивена Пенни использовать
-s
опциюnl
было интригующим, и тестирование показало, что оно не вводило нежелательную буферизацию, которая меня беспокоила.Однако было несколько проблем с использованием
nl
, связанных с желанием удалить ненужные номера строк (даже если вас не заботит их эстетика, могут быть случаи, когда использование дополнительных столбцов будет нежелательным). Во-первых, использование «вырезать» для удаления чисел вновь вводит проблему буферизации, так что это разрушает решение. Во-вторых, использование «-w1» не помогает, так как это НЕ ограничивает номер строки одним столбцом - оно становится шире, так как требуется больше цифр.Это не красиво, если вы хотите захватить это в другом месте, но так как это именно то, что мне не нужно было делать (все было уже записано в файлы журналов, я просто хотел посмотреть несколько одновременно в режиме реального времени), лучший Чтобы потерять номера строк и иметь только мой префикс, нужно было начинать
-s
строку с возврата каретки (CR или ^ M или Ctrl-M). Так, например:источник
-u
опцию sed, чтобы избежать буферизации.Используя ed:
Это заменяет для каждой строки (
,
) начало строки (^
) наprefix
.wq
сохраняет и выходит.Если строка замены содержит косую черту,
s
вместо этого мы можем использовать другой разделитель :Я процитировал разделитель here-doc
EOE
(«конец ed»), чтобы предотвратить расширение параметра. В этом примере он также будет работать без кавычек, но это хорошая практика, чтобы предотвратить неожиданности, если у вас когда-либо есть$
в вашем сценарии ed.источник
Используя & (всю часть ввода, которая была сопоставлена с шаблоном ”):
ИЛИ используя обратные ссылки:
источник
Вы также можете достичь этого, используя метод обратной ссылки
Вы также можете использовать с awk, как это
источник
Вот завернутый пример, использующий
sed
подход из этого ответа :prefix_lines
источник
PREFIX
содержит какие-либо специальные символы, такие как слеш.prefix_lines \*
Для людей в системах BSD / OSX есть утилита, называемая
lam
ламинатом.lam -s prefix file
будет делать то, что вы хотите. Я использую это в конвейерах, например:find -type f -exec lam -s "{}: " "{}" \; | fzf
... который найдет все файлы, exec lam для каждого из них, давая каждому файлу префикс своего имени файла. (И накачайте вывод в fzf для поиска.)
источник