Ответы:
Вы можете использовать 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-систем, за исключением, возможно, тех, которые прошли через его удаление.
sed -i
это не POSIX. Это GNU. У FreeBSD sed
есть похожая опция, но она вам нужна sed -i ''
.
-i
создает временную копию (поэтому я сказал, что изменения отражены в исходном файле); Я имел в виду, что вы получаете ту же семантику, что и замена на месте. Пожалуйста, убедитесь, что обновленный ответ соответствует POSIX.
$$
(идентификатор процесса текущей оболочки) как часть временного имени файла; он избегает попыток каждый раз command filename > filename.$$ && mv filename.$$ filename
:|paste -d'foo ' - - - - input > output
(шучу, хотя вы, вероятно, найдете самое быстрое из всех решений, опубликованных здесь: -b).
Канонический способ это:
sed 's/^/foo /' < input > output
Однако его нелегко адаптировать к произвольным строкам. Например,
sed "s/^/$var /"
Работает только если $var
не содержит, &
, \
, /
ни символы новой строки.
В связи с этим
export var
awk '{print ENVIRON["var"], $0}'
или
perl -pe '$_="$ENV{var} $_"'
будет работать лучше.
Я представляю решение, используя awk
предварительную строку «foo».
awk '{ print "foo", $0; }' input > output
awk
кроссплатформенный и доступен в любой системе POSIX. Это не делает редактирование на месте. Если вы хотите отредактировать файл без создания второго, вам придется использовать временный файл. Смотрите sed
ответ Джозефа , он показывает синтаксис. Другой способ - использовать следующий синтаксис, который в основном создает временный файл с тем же именем, что и исходный файл.
{ rm file; awk '{ print "foo", $0 }' > file; } < file
reducto# wc -l foo
`914 foo` reducto# { rm foo ; awk '{ print "prepend" , $0 }' > foo } < foo
>
Это не похоже на работу. Я пытался, потому что перенаправление на оригинал заставило меня нервничать, но оно даже не началось.
Вы можете избежать проблем редактирования на месте с помощью потоковых инструментов, используя инструмент, который обычно выполняет редактирование на месте - редактор!
ex sample.txt -c "%s/^/foo /" -c wq
Дополнительным преимуществом является то, что команды просты и очевидны для всех, кто разбирается в одном истинном редакторе.
Вы можете использовать perl
для этого:
$ perl -pi -e 's/^/mystring /' afile.txt
Создать образец файла.
$ seq 5 > afile.txt
$ cat afile.txt
1
2
3
4
5
Запустите приведенную выше команду:
$ perl -pi -e 's/^/mystring /' afile.txt
$ cat afile.txt
mystring 1
mystring 2
mystring 3
mystring 4
mystring 5
sed
, я показал, как использовать Perl .... не ища священной войны по этому вопросу.
Просто используя Bash
while IFS= read -r line; do echo "foo" "${line}" ; done < input > Output
Использование Python
python -c "import sys; print 'foo '.join([ l for l in sys.stdin.readlines() ])" < input > Output
Если вы хотите редактировать на месте
import fileinput
import sys
for line in fileinput.input(['inputfile'], inplace=True):
sys.stdout.write('foo {l}'.format(l=line))
awk
с очень маленькими файлами. Поведение варьируется в зависимости от реализации эха, и оно удаляет начальные и конечные пробелы и специально обрабатывает обратные слэши.
prefix () { while IFS= read -r REPLY; do printf "%s%s\n" "$1" "$REPLY"; done; }
должно быть более правильным.
{}
? Я думаю, что @Matt предлагал вам превратить его в именованную функцию, в чем смысл {}
без имени функции?
Или вы можете сделать следующее:
vi filename.txt
Esc(чтобы убедиться, что вы находитесь в NORMAL
режиме), а затем введите следующую команду:
:1,$ s/^/mystring
1,$
просто заменить на %
. Это делает команду :%s/^/string/
.
-i
переключатель не редактирует файл на месте. Он создает новый файл и перезаписывает исходный после того, как это сделано (доказательство: индекс изменяется). Существует не так много инструментов, которые фактически выполняют редактирование на месте, что является опасной операцией. Кроме того, поскольку вы упоминаете POSIX,-i
переключатель не является обязательным для POSIX-совместимогоsed
, это особенность некоторых конкретных реализаций.