grepで出力されたファイル名の後にスペースを追加するには?

grepで出力されたファイル名の後にスペースを追加するには?

私はgrepファイル内で一致するパターンを検索し、出力からファイル名をコピーするために使用します。この作業をあまりにも頻繁にしてみると結局:コピーもするようになりそうです。それでは、最初に一致する半列またはファイル名が終わる前に2つのスペースを追加できますか?

$ grep -Hrn -e "zorro" --color=always --exclude-dir=dir -I -F . | \
    cut -c 11- | awk '$0="\033[33;35m"$0' | tr -s '[:space:]'
doo.tex:1:zorro alper alper alper skfjsdlkfj dslfj dslkj

希望の出力:

doo.tex  :1:zorro alper alper alper skfjsdlkfj dslfj dslkj
        ^
  <two space added>

答え1

それでも私の最初は行きました

awk -F: -vOFS=: '{$1 = $1 "  "; print}'

しかし、私はそれが必要以上に物事が多いと思います。分裂して隊列に再加入することです。

これ選択肢はとてもきれいです

sed 's/:/  :/'

変える最初スペース2つとコロンがあるコロンです。


コロンの会話を含むファイル名関連:

GNU grep のマニュアルページをお読みください。-Zオプションの使用:「通常、ファイル名の後に続く文字の代わりに0バイト(ASCII NUL文字)を出力します。」

だから:

# .......v
grep -HrnZ -e "zorro" --color=always --exclude-dir=dir -I -F . | \
  perl -pe 's/\0/  :/'

答え2

「zorro」などのパターンに一致するテキストを含むファイル名のリストのみが必要で、そのファイル名を別のプログラムで使用したい場合は、次の操作を実行してファイル名を含むbash配列を作成できます。マウスを使用して手動でコピーして貼り付ける作業を避けてください。

mapfile -d '' -t myfiles < <(grep -IFlZr zorro ./)

mapfilestdinで配列を埋めるためのbash組み込みコマンド。この場合、標準入力は次のgrepように提供されます。プロセスの交換。 withを使用して入力がNUL文字で区切られていることを通知し、NULで区切られた一致するファイル名のリストを出力するために-d ''withを使用します。これは次のとおりです。mapfile-Zgrepどのコロン、スペース、改行、シェルメタ文字など、名前に含まれる文字に関係なくファイル名。

を使用して配列の内容を表示したり、配列要素declare -p myfilesを他のプログラム(たとえばprintf '%s\'n' "${myfiles[@]}")の引数として使用したり、同様のループで使用したりできますfor f in "${myfiles[@]}"; do echo "$f" ; done

注:grepの-lオプションは最初の一致後に終了するため(optionと同じ-m)、検索文字列がファイルの先頭に表示されるファイルの検索速度が速くなります。パターンが表示されないファイルでは、ファイル全体を読み取る必要があります。

ただし、このオプションを使用する理由が-Iバイナリファイル(TeXの.pdfや.dvi出力など)を回避したい場合は、次のようにfind使用できますgrep -r

mapfile -d '' -t myfiles < <(find . -type f -name '*.tex' -exec grep -lZF zorro {} +)

grepよりも複雑な選択基準が必要な場合は、grepの代わりにawkやperlなどを使用できます。たとえば、ファイルの3行目に「zorro」が表示されるファイル名のみを希望する場合:

mapfile -d '' -t myfiles < <(find . -type f -name '*.tex' \
  -exec perl -n -e 'if ($. == 3) {
                      printf "%s\0", $ARGV if (/\Qzorro\E/);
                      close(ARGV);
                    }' {} +)

これは単なる例です。標準を考えてPerl(またはawk、Pythonなど)スクリプトで書くことができる場合は、それを使用してオプションで配列を埋めることができます。ファイル名を標準出力として印刷してNUL文字で区切る限り、任意のコマンドまたは長くて複雑なコマンドパイプラインを使用できます。

注:close(ARGV)ファイル名が印刷されているかどうかに関係なく、現在のファイルを閉じて次のファイル(存在する場合)に移動します。つまり、ファイルから3行以上を読み取る必要がないため、大容量ファイルをたくさん検索する場合ははるかに高速です。

注2:\Qandは、grep\Eと同様に固定文字列検索を実行するPerlの方法です-F。 awkを使用すると、このindex()機能を使用して同様の操作を実行できます。

関連情報