Вы редактируете /etc/passwd
файл и изменение пользователи окружают от /bin/bash
, или /bin/sh
кому: /sbin/nologin
Можно использовать sed
:
sed -i 's/^/your_string /' your_file
Благодаря Stephane и комментариям Marco, обратите внимание что -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
Объяснение
Обе команды выполняют regex замену, заменяя начало строки (^
) с Вашей желаемой строкой. -i
переключатель в обеих командах удостоверяется, что файл редактируется на месте (т.е. изменения отражаются в файле вместо печатного к stdout).
sed
должно быть доступным на любой совместимой POSIX ОС и perl
должно быть доступным на большинстве современных Нельдов кроме, возможно, для тех, которые прошли усилие по удалению его.
Я представляю использование решения awk
предварительно ожидая строка “нечто”.
awk '{ print "foo", $0; }' input > output
awk
является межплатформенным и доступным в любой системе POSIX. Это не делает оперативного редактирования. Если Вы хотите отредактировать файл, не создавая второй, необходимо будет использовать временный файл. Посмотрите Joseph sed
ответ, это показывает синтаксис. Другой взлом должен использовать следующий синтаксис, который в основном создает временный файл с тем же именем файла как исходный файл.
{ rm file; awk '{ print "foo", $0 }' > file; } < file
reducto# wc -l foo
'914 нечто' reducto# { rm foo ; awk '{ print "prepend" , $0 }' > foo } < foo
>
Это, кажется, не работает. Я пробовал, потому что перенаправление к оригиналу раздражало меня, но это даже не запустится.
– kurtm
08.10.2013, 23:45
:|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} $_"'
работал бы лучше.
Можно избежать проблем оперативного редактирования с потоковыми инструментами при помощи инструмента, который обычно делает оперативное редактирование - редактор!
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.... не поиск священной войны по вопросу.
– slm♦
09.10.2013, 00:01
Просто использование 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
на очень маленьких файлах. Поведение варьируется через реализации эха, и оно разделяет начальные и конечные пробелы и обрабатывает обратные косые черты особенно.
– Stéphane Chazelas
08.10.2013, 23:12
prefix () { while IFS= read -r REPLY; do printf "%s%s\n" "$1" "$REPLY"; done; }
должно быть более корректным.
– Matt
08.10.2013, 23:34
{}
? Я думаю, что @Matt предлагал, чтобы Вы превратили его в именованную функцию, какой смысл {}
без имени функции?
– terdon♦
08.10.2013, 23:51
Или вы можете сделать следующее:
vi filename.txt
Esc (чтобы убедиться, что вы находитесь в режиме NORMAL
), а затем введите следующую команду:
:1,$ s/^/mystring
-i
переключатель не редактирует файл на месте. Это создает новый файл и перезаписывает исходный после того, как это сделало (доказательство: изменения inode). Нет многих инструментов, которые на самом деле делают оперативное редактирование, которое является опасной операцией. Кроме того, так как Вы упоминаете POSIX,-i
переключатель не обязателен для совместимого POSIXsed
, это - функция некоторых конкретных реализаций. – Marco 08.10.2013, 23:00sed -i
не POSIX. Это - GNU. FreeBSDsed
имеет подобную опцию, но Вам нужноsed -i ''
там. – Stéphane Chazelas 08.10.2013, 23:01-i
создает временную копию (вот почему, я сказал, что изменения отражаются в исходном файле); я подразумевал, что Вы получаете ту же семантику как оперативная замена. Проверьте, что обновленный ответ совместим POSIX. – Joseph R. 08.10.2013, 23:06$$
(идентификатор процесса текущей оболочки) как часть временного имени файла; это избегает усилия по размышлению о гарантируемом уникальном имени каждый раз:command filename > filename.$$ && mv filename.$$ filename
– Keith Thompson 09.10.2013, 02:18