Xargs rozdzielone znakiem nowej linii

40

Czy można xargsużywać tylko separatora nowej linii? (w bash na Linuksie i OS X, jeśli to ma znaczenie)

Wiem, że -0można go użyć, ale jest to PITA, ponieważ nie każde polecenie obsługuje dane rozdzielane wartościami NUL.

Kornel
źródło
Co próbujesz osiągnąć. Może istnieć inny sposób.
Wstrzymano do odwołania.
@Dennis Używam go do różnych rzeczy, często w przygotowaniu z grep, sed, bardzo podstawowym awk itp., Głównie do równoległego wykonywania. find -print0 -name \*.foo -maxdepth 1 | xargs -0 -P4jest o wiele za dużo do pisania w porównaniu z ls *.foo | xargs -P4.
Kornel
Skrypty i funkcje to dwa doskonałe sposoby na ograniczenie pisania.
Wstrzymano do odwołania.
To jest pytanie SO, prawda?
Charles Stewart

Odpowiedzi:

17

Coś w stylu

alias myxargs='perl -p -e "s/\n/\0/;" | xargs -0'
cat nonzerofile | myxargs command

powinno działać.

hurfdurf
źródło
38
tr '\n' '\0'też działa.
Kornel,
2
perl to przesada dla jednego znaku. trjest szybszy zarówno dla procesora, jak i dla twoich palców.
Hello World,
52

GNU xargs (domyślnie w systemie Linux; instalacja findutilsz MacPorts w OS X, aby go uzyskać) obsługuje, -dco pozwala określić niestandardowy ogranicznik dla danych wejściowych, dzięki czemu można to zrobić

ls *foo | xargs -d '\n' -P4 foo 
James
źródło
Mam alias xxargs="xargs -d '\n'"w swoim bashrc. Więc mogę po prostu robić takie rzeczy:grep -IRl foo | xxargs sed -i s/foo/bar/g
tylerl
4
To naprawdę powinna być zaakceptowana odpowiedź. Nie musisz wyrywać perla. Ale trto też dobry pomysł.
Ehtesh Choudhury,
3
brew install findutilsi gxargswłaśnie tego potrzebowałem na OS X, dzięki.
Brad Koch
5

W przypadku Bash generalnie wolę unikać xargs dla wszystkiego, co najmniej skomplikowane, na rzecz pętli podczas odczytu. W przypadku twojego pytania while read -ar LINE; do ...; donewykonuje zadanie (pamiętaj o stosowaniu składni tablicowej z LINE, np. ${LINE[@]}Dla całej linii). Nie wymaga to żadnych sztuczek: domyślnie read używa tylko \nznaku zakończenia linii.

Powinienem zadać pytanie na temat zalet i wad xargs vs. pętle podczas odczytu ... gotowe!

Charles Stewart
źródło
2
Może to tylko naśladować xargs -n1 -d'\n', a nie całość xargs.
Hello World,
@HelloWorld - Możesz z łatwością łączyć argumenty, dzięki czemu możesz także symulować xargs -n$Nprzy odrobinie dodatkowego skryptu.
Charles Stewart
Tak, jestem wśród zwycięzców, to tylko uwaga, o której warto wspomnieć.
Hello World,
Właśnie to robię! Dodatkowo możesz użyć readopcji, takich jak czytanie większej liczby słów w osobnych zmiennych lub zmiana ogranicznika za pomocą IFS=' '.
caesarsol
0

Nie ze standardową wersją. Mam zhakowaną wersję, która to robi - korzystałem z niej, zanim dowiedziałem się o ' find ... -print0 | xargs -0 ...'. Skontaktuj się ze mną, jeśli chcesz kopię - zobacz mój profil. (Brak wiedzy o rakietach - ale to po prostu działa. Nie jest to kompletna replika xargs.)

Jonathan Leffler
źródło
0

A co z cat file | xargs | sed 's/ /\n/ig'tym zamieni spacje w znaki nowej linii, używając standardowych narzędzi bash dla Linuksa.

Omar Al-Ithawi
źródło
Jeśli filezawiera spacje i znaki nowej linii, wynik tego polecenia uniemożliwi rozróżnienie między nimi, co wydaje się zmierzać w przeciwnym kierunku niż to, o które pyta to pytanie
Max Nanasy,