grep: tệp đầu vào 'X' cũng là đầu ra


12

Tôi sử dụng ubuntu 14.4và cố gắng chuyển hướng đầu ra của greplệnh thành một tệp, nhưng tôi vẫn gặp lỗi này:

grep: input file 'X' is also the output

Tôi đã tìm kiếm vấn đề này và chỉ phát hiện ra rằng đó là một lỗi ubuntu 12.4và không có bất kỳ mô tả nào, có ai có thể giúp tôi tìm ra vấn đề này không?

Tôi chạy lệnh sau:

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

Nếu bạn đang cố gắng grep pattern file > filethì nó không hoạt động. Bạn không thể sử dụng cùng một tệp làm đầu vào và đầu ra cho grep.
jimmij

tôi thêm lệnh của tôi! cảm ơn vì gợi ý, nhưng khi tôi cố gắng sử dụng một tập tin trong đường dẫn khác thì nó không dự đoán được và tôi không thể làm điều đó!
Kasramvd

ví dụ với ../fi lấy cái nàybash: ../f.txt: Permission denied
Kasramvd

hiển thị lệnh đầy đủ, tập tin đầu vào của bạn là gì, hoặc bạn đang sử dụng đường ống?
jimmij

1
Bây giờ tôi hiểu rằng bạn thực sự đang truy cập đệ quy toàn bộ cấu trúc thư mục và muốn nối kết quả vào tệp đã tồn tại trong cấu trúc này. Vấn đề là shell (bash, zsh, anything) trước tiên thực hiện chuyển hướng và chỉ sau đó quay lại các lệnh (grep trong ví dụ này). Nó có nghĩa là greptrong lệnh grep pattern file > filethấy tập tin đã trống, vì vậy không có gì là đầu vào. Tuy nhiên, nếu bạn sử dụng >>thay vì >sau đó, tệp không trống, nhưng grep sẽ không gặp lỗi vì nó có thể dẫn đến xử lý đệ quy cùng một dòng (mẫu) nhiều lần.
jimmij

Câu trả lời:


9

Không thể sử dụng cùng một tệp như đầu vào và đầu ra cho grep. Bạn có thể xem xét các lựa chọn thay thế sau:

  • tập tin tạm thời

    grep pattern file > tmp_file
    mv tmp_file file
    
  • quyến rũ

    sed -i -n '/pattern/p' file
  • đặt toàn bộ tệp vào biến (ý tưởng không sáng cho các tệp lớn)

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

1
sed có thể di động hơnsed -i '/pattern/!d' file
Costas

Nhưng trong trường hợp OP muốnsed -i -n 's/.*\(pattern\).*/\1/p' file
Costas

@Costas bạn đã đúng, câu hỏi đã được chỉnh sửa và thêm thông tin để người ta có thể đánh bóng sedcú pháp là tốt.
jimmij

5

Bạn có thể sử dụng --excludetrường trong greplệnh của bạn như vậy:

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

2
Đảm bảo myfilelà duy nhất vì nó chỉ áp dụng cho tên cơ sở của tệp. Bạn không muốn bỏ qua các tệp có cùng tên trong các thư mục khác.
Walf

1

Tôi tìm thấy một cách trong bash: cat >> IN_OUTPUT_FILE <<< "$(grep something IN_OUTPUT_FILE)"

Lệnh trong <<<"..."sẽ được thực hiện đầu tiên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.