3

複数のサブディレクトリにテキスト ファイルがあります

一部/パス/1/ファイル

一部/パス/2/ファイル

一部/パス/3/ファイル

一部/パス/foo/ファイル

...

試合のためにファイルをgrepできる必要がありますが、後でループを使用して各試合を個別に操作できるように、個々の改行を保持します。

私は持っている:

SITE=$(grep -w $1 some/path/*/file)

ただし、これにより、すべてが 1 行にまとめられた非常に長い文字列が生成されます。

理想的には、この変数には、各行のパス名から * の値が含まれます。

例えば:

一部/パス/1/ファイル

一部/パス/3/ファイル

を含む行が含まれてbarいます。

SITE=$(grep -w bar some/path/*/file)
echo $SITE

次のようになります。

some/path/one/file:this is a line of text that has bar in it
some/path/three/file:this is a line of text that has bar in it

しかし、代わりに、私はこれを取得します:

some/path/one/file:this is a line of text that has bar in it some/path/three/file:this is a line of text that has bar in it

この変数を複数行にして、後で次のようなことができるようにする方法はありますか?

for i in `echo $SITE`; do
WHATEVER=$(echo $i | cut -d ':' -f 1 | cut -d '/' -f 3)
echo $WHATEVER
done

出力は次のようになります。

one
three

それとも、私はこれを完全に間違った方法で行っていますか?

4

3 に答える 3

3

$()出力を 1 行に詰め込むのはコマンド置換ではありません。それはecho、引用符で囲まれていない変数のです。echo "$SITE"すると、複数行の出力が表示されます。

そうは言っても、行ごとに読むための一般的なアプローチはwhile read構文です。次のようなことができます。

while read line; do
    WHATEVER=$(echo "$i" | cut -d ':' -f 1 | cut -d '/' -f 3)
    echo $WHATEVER
done < <(grep -w bar some/path/*/file)

最後の行でプロセス置換の代わりにパイプを使用できることに注意してください。ただし<()、while ループ内で設定された変数が while ループの外側のスコープに留まる必要がある場合は、上記の方が適しています。

もちろん、これだけで出力を処理する必要がある場合は、次の方法の方がはるかに簡単です。

grep -w bar some/path/*/file | cut -d ':' -f 1 | cut -d '/' -f 3
于 2014-03-14T20:08:56.927 に答える
0

表示するだけの場合は、常にecho -e "$SITE". この-eオプションは、すべてのタブ、スペース、および改行をそのまま残します。引用符を忘れないでください。

スクリプトの各行を後で処理する場合は、次の方法を試すことができます。

echo -n "$SITE" | while read line ; do
  echo "$line"
done
于 2014-03-14T20:06:50.543 に答える