Я ищу способ добавить некоторую строку в начало каждой строки (та же строка для каждой строки). Не что-то настраиваемое, а скорее то, что будет легко запомнить и доступно на любой POSIX-совместимой платформе (и каждой оболочке).
источник
Я ищу способ добавить некоторую строку в начало каждой строки (та же строка для каждой строки). Не что-то настраиваемое, а скорее то, что будет легко запомнить и доступно на любой POSIX-совместимой платформе (и каждой оболочке).
Вы можете использовать sed
:
sed -i 's/^/your_string /' your_file
Благодаря комментариям Стефана и Марко, обратите внимание, что -i
опция не POSIX. POSIX способ сделать это будет
sed 's/^/your_string /' your_file > tmp_copy && mv tmp_copy your_file
или perl
:
perl -pi -e 's/^/your_string /' your_file
объяснение
Обе команды выполняют подстановку регулярных выражений, заменяя начало строки ( ^
) желаемой строкой. -i
Переключатель в обеих командах убеждается файл редактируется на месте (т.е. изменения отражаются в файле вместо печати на стандартный вывод).
sed
должен быть доступен в любой POSIX-совместимой ОС и perl
должен быть доступен в большинстве современных Unix-систем, за исключением, возможно, тех, которые прошли через его удаление.
-i
переключатель не редактирует файл на месте. Он создает новый файл и перезаписывает исходный после того, как это сделано (доказательство: индекс изменяется). Существует не так много инструментов, которые фактически выполняют редактирование на месте, что является опасной операцией. Кроме того, поскольку вы упоминаете POSIX,-i
переключатель не является обязательным для POSIX-совместимогоsed
, это особенность некоторых конкретных реализаций.sed -i
это не POSIX. Это GNU. У FreeBSDsed
есть похожая опция, но она вам нужнаsed -i ''
.-i
создает временную копию (поэтому я сказал, что изменения отражены в исходном файле); Я имел в виду, что вы получаете ту же семантику, что и замена на месте. Пожалуйста, убедитесь, что обновленный ответ соответствует POSIX.$$
(идентификатор процесса текущей оболочки) как часть временного имени файла; он избегает попыток каждый разcommand filename > filename.$$ && mv filename.$$ filename
(шучу, хотя вы, вероятно, найдете самое быстрое из всех решений, опубликованных здесь: -b).
Канонический способ это:
Однако его нелегко адаптировать к произвольным строкам. Например,
Работает только если
$var
не содержит,&
,\
,/
ни символы новой строки.В связи с этим
или
будет работать лучше.
источник
Я представляю решение, используя
awk
предварительную строку «foo».awk
кроссплатформенный и доступен в любой системе POSIX. Это не делает редактирование на месте. Если вы хотите отредактировать файл без создания второго, вам придется использовать временный файл. Смотритеsed
ответ Джозефа , он показывает синтаксис. Другой способ - использовать следующий синтаксис, который в основном создает временный файл с тем же именем, что и исходный файл.источник
reducto# wc -l foo
`914 foo`reducto# { rm foo ; awk '{ print "prepend" , $0 }' > foo } < foo
>
Это не похоже на работу. Я пытался, потому что перенаправление на оригинал заставило меня нервничать, но оно даже не началось.Вы можете избежать проблем редактирования на месте с помощью потоковых инструментов, используя инструмент, который обычно выполняет редактирование на месте - редактор!
Дополнительным преимуществом является то, что команды просты и очевидны для всех, кто разбирается в одном истинном редакторе.
источник
Вы можете использовать
perl
для этого:пример
Создать образец файла.
Запустите приведенную выше команду:
источник
sed
, я показал, как использовать Perl .... не ища священной войны по этому вопросу.Просто используя Bash
Использование Python
Если вы хотите редактировать на месте
Ссылка ссылка
источник
awk
с очень маленькими файлами. Поведение варьируется в зависимости от реализации эха, и оно удаляет начальные и конечные пробелы и специально обрабатывает обратные слэши.prefix () { while IFS= read -r REPLY; do printf "%s%s\n" "$1" "$REPLY"; done; }
должно быть более правильным.{}
? Я думаю, что @Matt предлагал вам превратить его в именованную функцию, в чем смысл{}
без имени функции?Или вы можете сделать следующее:
Esc(чтобы убедиться, что вы находитесь в
NORMAL
режиме), а затем введите следующую команду:источник
1,$
просто заменить на%
. Это делает команду:%s/^/string/
.