Я ищу способ добавить какую-нибудь строку в начало каждой строки (одну и ту же строку для каждой строки). Не что-то настраиваемое, а что-то, что будет легко запомнить и доступно на каждой POSIX-совместимой платформе (и каждой оболочке).
решение1
:|paste -d'foo ' - - - - input > output
(шутка, хотя вы, вероятно, обнаружите, что это самое быстрое из всех решений, опубликованных здесь :-b).
Канонический способ:
sed 's/^/foo /' < input > output
Однако его нелегко адаптировать к произвольным строкам. Например,
sed "s/^/$var /"
Работает только в том случае, если $var
не содержит символов , &
, или новой строки, и представляет собой уязвимость произвольного выполнения команд в GNU sed, по крайней мере, если это невозможно гарантировать \
./
В связи с этим,
export var
awk '{print ENVIRON["var"], $0}'
или
perl -pe '$_="$ENV{var} $_"'
будет работать лучше.
решение2
Вы можете использовать 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
Переключатель в обеих командах гарантирует, что файл будет отредактирован на месте (т. е. изменения будут отражены в файле, а не выведены на stdout).
sed
должен быть доступен на любой POSIX-совместимой ОС и perl
должен быть доступен на большинстве современных Unix-систем, за исключением, возможно, тех, которыепрошли через усилияего удаления.
решение3
Я предлагаю решение, в котором используется awk
добавление строки «foo».
awk '{ print "foo", $0; }' input > output
awk
является кроссплатформенным и доступен в любой системе POSIX. Он не выполняет редактирование на месте. Если вы хотите редактировать файл, не создавая второй, вам придется использовать временный файл. Смотрите sed
ответ Джозефа, он показывает синтаксис. Другой трюк — использовать следующий синтаксис, который по сути создает временный файл с тем же именем, что и у исходного файла.
{ rm file; awk '{ print "foo", $0 }' > file; } < file
решение4
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