Dodaj ## do każdej linii w pliku tekstowym

30

Chcę dodać skróty do wszystkich linii w zwykłym pliku tekstowym. Nie przeszkadza mi zarówno korzystanie z terminala, jak i GUI - po prostu muszę to zrobić.

Oxwivi
źródło

Odpowiedzi:

50

Możesz użyć seddo tego:

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

Zastępuje to początek wiersza ( ^) znakiem ##.

Za pomocą -i.bakprzełącznika sededytuje plik w miejscu, ale tworzy kopię zapasową z rozszerzeniem .bak.

Jukka Matilainen
źródło
1
+1 To jest pierwsza metoda tworzenia kopii zapasowych. I zawsze było inline zastąpić bezpośrednio: sed 's/^/##/' -i file. W takim przypadku byłoby to preferowane, ponieważ nie może się nie udać. W innych przypadkach to polecenie można połączyć z, diff -u file.bak fileaby zobaczyć różnice (w razie potrzeby przeprowadź je przez rurkę less). Jeśli okaże się, że działa, kopię zapasową można usunąć. W przeciwnym razie można go przywrócić za pomocą prostego mv file.bak file.
Lekensteyn,
1
Elegancki. Myślałem o czymś takim sed 's/^\(.*\)$/##\1/', ale jest to o wiele ładniejsze.
umów się
Fajny ... Myślałem o tym, żeby zasugerować Vimowi ...
Sathish,
Pomogło mi to przekonwertować plik listy bloków :) Dziękuję 1+
Neil
8

Oto rozwiązanie tego problemu za pomocą Perla

perl -e 'while (<>) {print "##$_"}' < infile > outfile
beav_35
źródło
2
-pPrzełącznik jest również przydatny: perl -pe 's/^/##/' infile > outfile. (Istnieje również -i[extension]przełącznik zastępowania pliku docelowego na miejscu.) Perldoc.perl.org/perlrun.html#%2a-p%2a
Jukka Matilainen
6

Podczas gdy jesteśmy przy tym:

gawk -i inplace '{print "##"$0}' infile

Wykorzystuje (stosunkowo nową) wtyczkę edycyjną dla GNU awk 4.1.0+.

muru
źródło
4

Oto bashsposób:

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

( W bashpowłoce działa read -rbez innych argumentów IFS= read -r REPLY.)

Jest to zainspirowane stylistycznie przez rozwiązanie perla beav_35 , które, przyznaję, prawdopodobnie działa znacznie szybciej w przypadku dużych plików, ponieważ perlmożna oczekiwać, że będzie bardziej wydajne niż powłoka, jeśli chodzi o przetwarzanie tekstu.

Eliah Kagan
źródło
3

sed -inie jest standardem POSIX, więc jeśli jesteś purystą, będziesz chciał użyć ed:

printf ",s/^/##/\nw\nq" | ed -s file.txt
fkraiem
źródło
3

Oto łatwiejszy perlsposób niż gdzie indziej:

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

To (ab) wykorzystuje fakt, że perl -pdrukuje linię po wykonaniu polecenia podanego w -e.

w płomieniach
źródło
0

Możesz używać Vima w trybie Ex:

ex -sc '%s/^/##/|x' file
  1. % wybierz wszystkie linie

  2. s zastąpić

  3. x Zapisz i zamknij

Steven Penny
źródło
0

Można to zrobić za pomocą funkcji mapowania Pythona i przekierowania standardowego wejścia:

$ 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

Zapisz wynik w nowym pliku i użyj go zamiast oryginalnego

Sergiy Kolodyazhnyy
źródło