grep:入力ファイル「X」も出力です


12

を使用してubuntu 14.4grepコマンドの出力をファイルにリダイレクトしようとしましたが、このエラーが発生し続けます。

grep: input file 'X' is also the output

私はこの問題を検索しましたが、それがバグでubuntu 12.4あり、何も説明されていないことがわかりました。誰かがこの問題を理解するのを手伝ってくれませんか?

次のコマンドを実行します。

grep -E -r -o -n r"%}(.*){%" > myfile

あなたがしようgrep pattern file > fileとしているなら、それはうまくいきません。grepの入力と出力に同じファイルを使用することはできません。
jimmij 2014年

コマンドを追加します!ヒントをありがとう、しかし、私が他のパスでファイルを使用しようとすると、それは述語ではなく、それを行うことはできません!
Kasramvd 2014年

たとえば、.. / fiでこれを取得bash: ../f.txt: Permission denied
Kasramvd 2014年

show fullコマンド、入力ファイルは何ですか、それともパイプを使用していますか?
jimmij 2014年

1
今私はあなたが実際にディレクトリ構造全体を再帰的に模索していることを理解し、この構造にすでに存在するファイルに結果を追加したいと考えています。問題は、シェル(bash、zshなど)が最初にリダイレクトを実行してから、コマンド(この例ではgrep)に戻ることです。これはgrep、コマンドでgrep pattern file > file既に空のファイルが表示されるため、入力として何もないことを意味します。ただし、の>>代わりにを使用すると>、ファイルは空ではありませんが、grepは同じ行(パターン)を繰り返し再帰的に処理する可能性があるため、エラーをスローします。
jimmij 2014年

回答:


9

の入力と出力に同じファイルを使用することはできませんgrep。次の代替案を検討できます。

  • 一時ファイル

    grep pattern file > tmp_file
    mv tmp_file file
  • sed

    sed -i -n '/pattern/p' file
  • ファイル全体を変数に入れます(大きなファイルの場合は賢明ではありません)

    x=$(cat file); echo "$x" | grep pattern > file

1
sedの方が移植性が高いsed -i '/pattern/!d' file
Costas 2014年

しかし、OPが望む場合sed -i -n 's/.*\(pattern\).*/\1/p' file
Costas 2014年

@Costas正解です。質問が編集され、sed構文が洗練されるように追加情報が追加されました。
jimmij 2014年

5

次のようにコマンドで--excludeフィールドを使用できますgrep

grep  --exclude=myfile  -Eron  r"%}(.*){%"  >  myfile

2
myfileファイルのベース名にのみ適用されるため、一意であることを確認してください。他のディレクトリにある同じ名前のファイルをスキップしたくない場合。
Walf

1

私はbashで方法を見つけました: cat >> IN_OUTPUT_FILE <<< "$(grep something IN_OUTPUT_FILE)"

のコマンドが<<<"..."最初に実行されます。

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