改行で区切られたxargs


41

区切り文字として改行のみxargs使用することは可能ですか?(LinuxおよびOS Xのbashでは、それが重要な場合)

-0使用できることはわかっていますが、すべてのコマンドがNUL区切りの出力をサポートしているわけではないため、PITAです。


あなたが達成しようとしていることは何ですか。別の方法があります。
追って通知があるまで一時停止します。

@Dennis主に実行を並列化するために、多くの場合grep、sed、非常に基本的なawkなどのパイプラインで、さまざまなことに使用します。 find -print0 -name \*.foo -maxdepth 1 | xargs -0 -P4と比較して入力するのが多すぎるls *.foo | xargs -P4
コーネル

スクリプトと関数は、入力を減らす2つの優れた方法です。
追って通知があるまで一時停止します。

これはとても質問ですね。
チャールズスチュワート

回答:


17

の線に沿って何か

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

動作するはずです。


38
tr '\n' '\0'も動作します。
コーネル

2
perlは単一のキャラクターにとってはやり過ぎです。trCPUと指の両方で高速です。
ハローワールド

53

GNU xargs(Linuxのデフォルト、findutilsOS XのMacPortsからインストールして取得)をサポートし-dているため、入力用のカスタム区切り文字指定できるため、

ls *foo | xargs -d '\n' -P4 foo 

私はalias xxargs="xargs -d '\n'"bashrcにいます。:私はちょうどこのようなものを行うことができるようにgrep -IRl foo | xxargs sed -i s/foo/bar/g
tylerl

4
これは本当に受け入れられた答えであるべきです。perlを破る必要はありません。しかしはtrあまりにも良いアイデアです。
Ehteshチョードリー

3
brew install findutilsそしてgxargs私は、OS X上のおかげでまさに必要でした。
ブラッドコッホ

5

Bashを使用する場合、一般的には、ちょっとしたトリッキーなものについてはxargsを避け、while-readループを優先します。あなたの質問のためにwhile read -ar LINE; do ...; done、仕事をします(たとえば、${LINE[@]}行全体で配列構文をLINEで使用することを忘れないでください)。これはトリックを必要としません。デフォルトでは、readはちょうど\n行末文字として使用します。

読みながら、私はループをxargsの対の長所と短所についてのSOに質問を投稿する必要があります... やりました!


2
これはエミュレートすることができるだけでxargs -n1 -d'\n'、全体ではありませんxargs
ハローワールド

@HelloWorld-引数を簡単に束ねることができるためxargs -n$N、追加のスクリプトを少し追加するだけで同様にシミュレートできます。
チャールズスチュワート

はい、私は支持者の一人です、それは言及する価値のある発言にすぎません。
ハローワールド

これはまさに私がやっていることです!さらに、read別の変数でより多くの単語を読む、またはで区切り文字を変更するなどのオプションを使用できますIFS=' '
caesarsol

0

標準バージョンではありません。私はそれを行うハッキングされたバージョンを持っています-' find ... -print0 | xargs -0 ...' を知る前にそれを使用しました。コピーが必要な場合は私に連絡してください-私のプロフィールをご覧ください。(ロケット科学はありません-それは仕事をしますが、完全なxargsレプリカではありません。)


0

これについてcat file | xargs | sed 's/ /\n/ig'は、標準のLinux bashツールを使用して、スペースを改行に変換します。


場合はfile、スペースや改行が含まれている場合、このコマンドの結果はこの質問を求めてきたのと反対方向に向かっているように思われ、それは不可能それらを区別するようになります
マックスNanasy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.