Zawartość source.txt
:
gold green white black blue
yellow magenta brown
tram kilo charlie tango
Cześć wszystkim! Muszę rozwiązać zagadkę.
Próbuję uruchomić mały skrypt, aby grep pliku source.txt
, grep
wyjście potoku, aby sed
zastąpić ciąg i zapisać tę linię w nowym plikupol.txt
grep -l "gold" source.txt | xargs sed 's/green/red/' > pol.txt
Zamiast mieć jedyną tę linię w pol.txt
:
gold red white black blue
Mam cały sam plik z ciągiem, który zastąpiłem
gold red white black blue
yellow magenta brown
tram kilo charlie tango
Kiedy -l
usuwam opcję z polecenia grep, mam to i oczywiście nic w pol.txt
sed: can't read gold: No such file or directory
sed: can't read green: No such file or directory
sed: can't read white: No such file or directory
sed: can't read black: No such file or directory
sed: can't read blue: No such file or directory
grep
jest potrzebny jako tester i niestety opcja „jeśli” nie jest opcją.
source.txt
zapisany plik? Wydaje mi się, że może to być pomieszanie między zwrotami karetki a pomieszaniem kanałów i linii.grep
ised
razem -sed
sama prawdopodobnie prawdopodobnie może zrobić wszystko, co oba programy mogą zrobić razem. Jeśli masz problem z wieloma plikami wejściowymi i potrzebujesz przetworzyć tylko te, które zawierają „złoto”, prawdopodobnie powinieneś to wyjaśnić; w przeciwnym razie ludzie, którzy próbują odpowiedzieć na twoje pytanie, mają jedną rękę związaną za plecami. (Proszę nie odpowiadać w komentarzach; edytuj swoje pytanie, aby było jaśniejsze i bardziej kompletne.) Jak wyjaśnia Satya Mishra,grep -l "gold" source.txt
wyświetlisource.txt
… (ciąg dalszy)source.txt
nazwa pliku, nie ma mowy, aby proces po prawej stronie potoku wiedział, że chcesz, aby przetwarzał tylko linie zawierające „złoto”, chyba że wbudujesz to w polecenie (jak pokazuje John). (Jego komendę można trochę uprościć, abysed -n '/gold/s/green/red/p' source.txt
. A jeśli potrafisz pisaćsed 's/green/red/'
, czy to naprawdę jest tak „przerażające”, że utrzymanie go będzie „bolesne”?)Odpowiedzi:
Aby wybrać dowolną linię zawierającą
gold
od source.txt i zastąpić pierwsze wystąpieniegreen
zred
:Aby zapisać to w pliku:
Jak to działa
-n
mówi sed, aby nie drukował linii, chyba że wyraźnie o to poprosimy./gold/
wybiera linie pasujące do wyrażenia regularnegogold
.s/green/red/
wykonuje podstawieniep
odbitki.Korzystanie z awk
Z tą samą logiką:
Korzystanie z grep
Jeśli z powodów jeszcze nie wyjaśnionych jesteśmy zmuszeni do korzystania z potoku grep, spróbuj:
źródło
for
pętli. Sed może przyjmować wiele nazw plików w jednym wierszu poleceń. (Jeśli wciąż jest więcej wymagań, zamiast ujawniać swój cel fragmentarycznie, równie dobrze możesz po prostu określić je wszystkie naraz.)grep -l "gold" source.txt
wyświetli,source.txt
jeśli plik zawiera słowo goldxargs sed 's/green/red/'
,sed 's/green/red/' source.txt
a końcowe przekierowanie zapisze wynik w twoich wynikach.Jeśli dobrze rozumiem twoją intencję, potrzebujesz następującego polecenia:
Te
/gold/
linie zaznaczane są dopasowanegold
is
komenda robi wymiany chcesz.źródło