2013-03-01 22 views
34

Chcę dodać konkretną linię, powiedzmy avatar do plików rozpoczynających się od MakeFile, a avatar do 15. linii w pliku.Dodaj tekst do pliku w określonej linii w systemie Linux

To jak dodać tekst do plików:

echo 'avatar' >> MakeFile.websvc 

i to, jak dodać tekst do plików, które rozpoczyna się z Makefile myślę:

echo 'avatar' >> *MakeFile. 

Ale nie uda się dodać ten wiersz do 15. wiersza pliku.

+0

Drugim przykładem jest źle. Musisz przechwytywać pliki i dodawać wiersz do każdego pliku osobno. Jeśli chcesz dodać tekst w środku pliku, musisz przejrzeć zawartość pliku i wstawić swoje rzeczy, gdy dotrzesz do właściwego miejsca. –

Odpowiedz

53

Można użyć sed aby rozwiązać ten problem:

sed "15i avatar" Makefile.txt 

lub użyć opcji -i aby zapisać zmiany wprowadzone w pliku.

sed -i "15i avatar" Makefile.txt 

Aby zmienić wszystkie pliki rozpoczynające że zaczynają Makefile:

sed "15i avatar" Makefile* 

Uwaga: W powyższym 15 jest linia zainteresowania, aby umieścić tekst.

0
perl -pi -e 'if($.==14){s/\n/\navatar\n/g}if(eof){$.=0}' MakeFile* 
2

Korzystanie sed:

sed -i '15i\avatar\' Makefile* 

gdzie opcja -i oznacza, że ​​transformacja zachodzi w miejscu (co jest przydatne na przykład gdy chcemy przetwarzać kilka plików).

Również w pytaniu, * MakeFile oznacza "wszystkie pliki kończące się MakeFile", a "wszystkie pliki zaczynające się od MakeFile" będą oznaczane jako MakeFile *.

2

Jeśli trzeba przejść w ciągu i opcji linia numer do skryptu, spróbuj tego:

perl -i -slpe 'print $s if $. == $n; $. = 0 if eof' -- -n=15 -s="avatar" Makefile* 

-i edytować plik wejściowy, nie rób kopię zapasową
$. jest linia numer

Jest to oparte na moim rozwiązaniu do Insert a line at specific line number with sed or awk, które zawiera kilka innych metod przekazywania opcji do Perla, a także objaśnienia opcji wiersza poleceń.

1

Jeśli chcesz bardziej przenośną wersję, możesz użyć ex, która będzie działać na dowolnym systemie * Nix. (Jest to specified by POSIX.) Polecenia Sed podane do tej pory zależą od GNU Sed.

Aby wstawić wiersz zawierający jedynie „Avatar” na 15 linii każdego pliku w bieżącym katalogu, którego nazwa zaczyna się, stosowanie „Makefile.”:

for f in MakeFile.*; do printf '%s\n' 15i 'avatar' . x | ex "$f"; done