trをxargsと組み合わせて重複を押し出すために切り取る方法

trをxargsと組み合わせて重複を押し出すために切り取る方法

最高の答えこの問題繰り返される空白に基づいて切り取るcutためにwithで使用できることを示します。tr

< file tr -s ' ' | cut -d ' ' -f 8

ディレクトリ内の複数のGitリポジトリのリモートアドレスを取得し、次を使用して各リポジトリからリモートURLフィールドを抽出しようとしています。

ls | xargs -I{} git -C {} remote -vv | sed -n 'p;n' | tr -s " " | cut -d ' ' -f1

ただし、これにより次のような出力が発生します。ここでは、2つの連続したスペース(Unicodeコードポイント32)が保存されていることがわかります。

origin  https://github.com/jik876/hifi-gan.git
origin  https://github.com/NVIDIA/NeMo.git
origin  https://github.com/NVIDIA/tacotron2.git

(私も使ってxargsみましたtr

必要な出力はURLのリストです。たとえば、次のようになります。

https://github.com/jik876/hifi-gan.git
https://github.com/NVIDIA/NeMo.git
https://github.com/NVIDIA/tacotron2.git

私がここで何を見逃しているのでしょうか?

ベストアンサー1

2つのスペースではなくタブです。

シェルループを使用して、現在の作業ディレクトリにディレクトリがあるサブディレクトリを繰り返し、空白で区切られた最初のフィールドを.git繰り返し(最後に追加されたタグを削除するために)各リモート+ URLに渡すことができます。 1行だけ表示するには:cut(fetch)(push)gituniq

for r in ./*/.git/; do
    git -C "$r" remote -v
done | cut -f 1 -d ' ' | uniq | cut -f 2

最後の項目は、cut -f 2タブで区切られた2番目のフィールドを返してURLを区切ります。

タブとスペースが同じように処理されることを考慮するとawk(特定の区切り記号やパターンを使用しない限り)、後続のパイプを単一の呼び出しに置き換えることができますawk

for r in ./*/.git/; do
    git -C "$r" remote -v
done | awk '!seen[$2]++ { print $2 }'

おすすめ記事