行の最初の単語でxargsを実行します


4

行の最初の引数のみでxargsを実行する方法はありますか?したがって、私の入力が次のgrepようにaからのデフォルト出力である場合:

./file1       "matching string"
./file2       "matching 2"

私がやりたいのは、Vimですべてのファイル名を| xargs vim

xargs各行の最初の単語を取得するように指示できますか?

AWKにパイプして余分な行のゴミをすべて取り除き、ファイル名のみを返すようにgrepを取得するなど、これを行う他の方法があることを知っています-xargsでこれを行うことができるかどうか興味があります。


それが発明された理由cutです?
billc.cn

回答:


8

他の人が述べたように、ジェネリックxargsはこれだけではできません。一般的なUnixツールにこだわっcutて、xargsに送信する前にコマンドを使用して余分な情報を取り除く必要があります。

入力が次のようになっていると仮定します。

./file1       "matching string"
./file2       "matching 2"

を使用|cut -f 1 -d ' ' | xargs -n 1 viしてコマンドを実行できます。

  • このcut -f 1 -d ' 'コマンドは、列1の内容のみを出力に送信します。
  • xargs -n 1 viVIを実行しますが、一度に一つのファイルを使用するようにxargsのを伝えます。

-n 1単一のviインスタンスを使用してすべてのファイルを編集する場合(ファイル間でコピー/貼り付けバッファーを保持する場合)を削除してもかまいません。


1

xargs自体でこれを行うことはできません。

そのため、オプションは、grepに渡す必要があるものだけを出力するかxargs、パイプを介しcutて必要なものを削除します。

これは* nixの方法であることを忘れないでください-各ユーティリティを可能な限りフォーカスし、それらを組み合わせて使用​​して結果を達成します(複数のユーティリティで機能を複製するのではなく)。


「grepをxargsに渡すのに必要なものだけを出力する」:それが-lフラグです。「grep -l」は、一致するファイルの名前を出力するだけです。それをxargsにパイプすることができます。ファイル名にスペースが含まれる場合は、「xargs -d \\ n」を使用します。
ランディオリソン

1

GNU Parallelを使用すると、次のことができます。

... | grep ... | parallel --colsep ' +' -X --tty vi {1}

emacsでも動作します:

... | grep ... | parallel --colsep ' +' -X --tty emacs {1}

GNU Parallelは次の方法で簡単にインストールできます。

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel

詳細については、イントロビデオをご覧くださいhttps : //www.youtube.com/playlist?list=PL284C9FF2488BC6D1

チュートリアルをご覧ください(man parallel_tutorial)。あなたはそれを愛しているコマンドラインです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.