Mam plik jak poniżej:
line1
line2
line3
I chcę uzyskać:
prefixline1
prefixline2
prefixline3
Mógłbym napisać skrypt Ruby, ale lepiej, jeśli nie muszę.
prefix
będzie zawierać /
. Na przykład jest to ścieżka /opt/workdir/
.
linux
scripting
text-processing
pierrotlefou
źródło
źródło
sed
takie lekkie zadania. Jeśli znany jest „prefiks”, bardzo łatwo jest wybrać znak nie z „prefiksu”.sed
z potoku, npfoo | sed -e 's/^/x /' | bar
.sed -e '2,$s/^/prefix/'
./
jak\/
(w ciągach pojedynczych) lub\\/
(w ciągach podwójnych)sed -e 's/$/postfix/' file
jeśli chcesz dodać ciąg na końcu każdej linii.Z Perlem (zamiennik na miejscu):
źródło
prtinf "$VARIABLE\n" | awk '$0="prefix"$0'
awk
raportyawk: out of memory in readrec 1 source line number 1
, ale rozwiązanie zsed
pomyślnie się kończy.Możesz używać Vima w trybie Ex:
%
wybierz wszystkie linies
zastąpićx
Zapisz i zamknijźródło
:%s/^/prefix/
, ponieważ ta strategia przydaje się w wielu sytuacjachJeśli twój prefiks jest nieco skomplikowany, po prostu umieść go w zmiennej:
Następnie przekazujesz tę zmienną i pozwalasz awk sobie z tym poradzić:
źródło
Jeśli masz Perla:
źródło
Za pomocą powłoki:
źródło
Oto wysoce czytelne rozwiązanie oneliner, wykorzystujące
ts
polecenie z moreutilsI w jaki sposób jest uzyskiwany krok po kroku:
źródło
Chociaż nie sądzę, by Pierr miał takie obawy, potrzebowałem rozwiązania, które nie opóźniałoby wyjścia z „ogona” pliku na żywo, ponieważ chciałem monitorować kilka dzienników alertów jednocześnie, poprzedzając każdą linię nazwą odpowiedniego dziennika .
Niestety, sed, cut itp. Wprowadziły za dużo buforowania i powstrzymały mnie od oglądania najnowszych linii. Sugestia Stevena Penny'ego, aby skorzystać z
-s
opcji,nl
była intrygująca, a testy wykazały, że nie wprowadziło to niechcianego buforowania, które mnie dotyczyło.Było jednak kilka problemów związanych z używaniem
nl
, związanych z chęcią usunięcia niechcianych numerów linii (nawet jeśli nie zależy ci na estetyce, mogą wystąpić przypadki, w których użycie dodatkowych kolumn byłoby niepożądane). Po pierwsze, użycie „cut” do usunięcia liczb ponownie wprowadza problem buforowania, więc rujnuje rozwiązanie. Po drugie, użycie „-w1” nie pomaga, ponieważ to NIE ogranicza numeru linii do pojedynczej kolumny - po prostu poszerza się, ponieważ potrzeba więcej cyfr.To nie jest ładne, jeśli chcesz uchwycić to gdzie indziej, ale ponieważ dokładnie tego nie musiałem robić (wszystko było już zapisane w plikach dziennika, chciałem tylko oglądać kilka naraz w czasie rzeczywistym), najlepiej sposobem na utratę numerów linii i posiadanie tylko mojego prefiksu było rozpoczęcie
-s
łańcucha od znaku powrotu karetki (CR lub ^ M lub Ctrl-M). Na przykład:źródło
-u
opcji sed, aby uniknąć buforowania.Za pomocą ed:
To zastępuje, dla każdej linii (
,
), początek linii (^
) znakiemprefix
.wq
zapisuje i wychodzi.Jeśli ciąg zastępujący zawiera ukośnik,
s
zamiast tego możemy użyć innego ogranicznika :Przytoczyłem ogranicznik tutaj-doc
EOE
(„koniec edycji”), aby zapobiec rozszerzaniu parametrów. W tym przykładzie działałoby to również bez cudzysłowu, ale dobrą praktyką jest zapobieganie niespodziankom, jeśli kiedykolwiek masz$
w swoim skrypcie ed.źródło
Używając & (cała część danych wejściowych, która została dopasowana przez wzorzec ”):
LUB używając referencji:
źródło
Możesz to również osiągnąć za pomocą techniki odsyłania wstecznego
Możesz także używać z awk w ten sposób
źródło
Oto zawarty przykład z wykorzystaniem
sed
podejścia z tej odpowiedzi :linie_refiksów
źródło
PREFIX
zawiera jakieś znaki specjalne do sedowania jak ukośnik.prefix_lines \*
Dla osób korzystających z systemów BSD / OSX istnieje narzędzie zwane
lam
skrótem do laminatu.lam -s prefix file
zrobi co chcesz. Używam go w rurociągach, np .:find -type f -exec lam -s "{}: " "{}" \; | fzf
... który znajdzie wszystkie pliki, wykonaj polecenie lam na każdym z nich, nadając każdemu plikowi prefiks własnej nazwy pliku. (I przepompuj dane wyjściowe do fzf w celu wyszukiwania.)
źródło