Какой самый простой способ добавить строку в начало каждой строки файла из командной строки?

Какой самый простой способ добавить строку в начало каждой строки файла из командной строки?

Я ищу способ добавить какую-нибудь строку в начало каждой строки (одну и ту же строку для каждой строки). Не что-то настраиваемое, а что-то, что будет легко запомнить и доступно на каждой 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

Связанный контент