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.


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ć.


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 

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!


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.)


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.


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.