Добавить ## к каждой строке в текстовом файле

30

Я хочу добавить хэши ко всем строкам в обычном текстовом файле. Я в порядке с использованием терминала и графического интерфейса - мне просто нужно сделать это.

Oxwivi
источник

Ответы:

50

Вы можете использовать sedдля этого:

sed -i.bak 's/^/##/' file

Это заменяет начало строки ( ^) на ##.

С помощью -i.bakпереключателя sedредактирует файл на месте, но создает резервную копию с расширением .bak.

Юкка Мателайнен
источник
1
+1 Это первый раз, когда я сталкиваюсь с этим методом резервного копирования. Я всегда так инлайн заменить непосредственно: sed 's/^/##/' -i file. В этом случае это было бы предпочтительным, так как это не может пойти не так. В других случаях эта команда может быть объединена с, diff -u file.bak fileчтобы увидеть различия (при необходимости, передать это через less). Если подтверждено, что резервная копия может быть удалена. В противном случае это может быть восстановлено с помощью простого mv file.bak file.
Лекенштейн
1
Элегантный. Я думал о чем-то вроде sed 's/^\(.*\)$/##\1/', но это гораздо приятнее.
аранжировать
Хороший ... Я думал о том, чтобы предложить
Виму
Это помогло мне преобразовать файл с черным списком :) Спасибо 1+
Нил
8

Вот решение этой проблемы с использованием Perl

perl -e 'while (<>) {print "##$_"}' < infile > outfile
beav_35
источник
2
-pПереключатель также полезен: perl -pe 's/^/##/' infile > outfile. (Также есть -i[extension]переключатель для замены целевого файла на месте.) Perldoc.perl.org/perlrun.html#%2a-p%2a
Юкка Матилинен
4

Вот bashспособ:

while read -r; do printf '##%s\n' "$REPLY"; done < infile > outfile

( В bashоболочке запуск read -rбез других аргументов работает подобно IFS= read -r REPLY.)

Это стилистически вдохновлено Perl-решением beav_35 , которое, я допускаю, вероятно, работает намного быстрее для больших файлов, поскольку perlможно ожидать, что оно будет более эффективным, чем оболочка, когда дело доходит до обработки текста.

Элия ​​Каган
источник
3

sed -iне является стандартом POSIX, поэтому, если вы пурист, вы захотите использовать ed:

printf ",s/^/##/\nw\nq" | ed -s file.txt
fkraiem
источник
3

Вот более простой perlспособ, чем в других местах:

perl -pi -e 'print "##"' YOURFILEHERE

Это (ab) использует тот факт, что perl -pпечатает строку после выполнения команды, указанной в -e.

abligh
источник
0

Вы можете использовать Vim в режиме Ex:

ex -sc '%s/^/##/|x' file
  1. % выбрать все строки

  2. s замена

  3. x сохранить и закрыть

Стивен Пенни
источник
0

Может быть сделано с помощью функции отображения Python и перенаправления стандартного ввода:

$ cat input.txt                                                                                                          
lorem ipsum
quick brown fox
hello world
$ python -c 'import sys;print "".join(map(lambda x: "##"+x,sys.stdin.readlines()))'  < input.txt                         
##lorem ipsum
##quick brown fox
##hello world

Сохраните вывод в новый файл и используйте его вместо оригинального

Сергей Колодяжный
источник