grep: อินพุตไฟล์ 'X' เป็นเอาต์พุตเช่นกัน


12

ฉันใช้ubuntu 14.4และพยายามเปลี่ยนเส้นทางผลลัพธ์ของgrepคำสั่งไปยังไฟล์ แต่ฉันได้รับข้อผิดพลาดนี้:

grep: input file 'X' is also the output

ฉันค้นหาปัญหานี้แล้วและเพิ่งพบว่าเป็นข้อผิดพลาดubuntu 12.4และไม่มีคำอธิบายใด ๆ ใครสามารถช่วยฉันหาปัญหานี้ได้บ้าง

ฉันเรียกใช้คำสั่งต่อไปนี้:

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

หากคุณพยายามgrep pattern file > fileแล้วมันไม่ทำงาน คุณไม่สามารถใช้ไฟล์เดียวกันกับอินพุตและเอาต์พุตสำหรับ grep
jimmij

ฉันเพิ่มคำสั่งของฉัน! ขอบคุณสำหรับคำใบ้ แต่เมื่อฉันพยายามที่จะใช้ไฟล์ในเส้นทางอื่น ๆ มันไม่ได้บ่งบอกมันและฉันก็ทำอย่างนั้นไม่ได้!
Kasramvd

เช่นกับ ../fi รับสิ่งนี้bash: ../f.txt: Permission denied
Kasramvd

แสดงคำสั่งแบบเต็มไฟล์อินพุตของคุณคืออะไรหรือคุณกำลังใช้ไพพ์
jimmij

1
ตอนนี้ฉันเข้าใจแล้วว่าคุณกำลัง greping โครงสร้างไดเรกทอรีทั้งหมดซ้ำและต้องการผนวกผลลัพธ์ไปยังไฟล์ที่มีอยู่แล้วในโครงสร้างนี้ ปัญหาคือเชลล์ (bash, zsh, อะไรก็ตาม) ก่อนทำการเปลี่ยนเส้นทางจากนั้นกลับไปที่คำสั่ง (grep ในตัวอย่างนี้) หมายความว่าgrepในคำสั่งgrep pattern file > fileเห็นไฟล์ที่ว่างอยู่แล้วดังนั้นจึงไม่มีอะไรเป็นอินพุต อย่างไรก็ตามหากคุณใช้>>แทน>ไฟล์จะไม่ว่างเปล่า แต่ grep จะแสดงข้อผิดพลาดเนื่องจากอาจทำให้เกิดการประมวลผลซ้ำในบรรทัดเดียวกัน (รูปแบบ) ซ้ำแล้วซ้ำอีก
jimmij

คำตอบ:


9

มันไม่ได้เป็นไปได้ที่จะใช้ไฟล์เดียวกับ input และ output 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

แต่ในกรณีที่ OP ต้องการsed -i -n 's/.*\(pattern\).*/\1/p' file
Costas

@Costas คุณถูกคำถามถูกแก้ไขและเพิ่มข้อมูลเพิ่มเติมเพื่อให้สามารถขัดsedไวยากรณ์เช่นกัน
jimmij

5

คุณสามารถใช้--excludeฟิลด์ในgrepคำสั่งของคุณดังนี้:

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

2
ตรวจสอบให้แน่ใจว่าmyfileไม่ซ้ำกันเนื่องจากจะใช้กับชื่อไฟล์พื้นฐานเท่านั้น คุณไม่ต้องการข้ามไฟล์ที่มีชื่อเดียวกันในไดเรกทอรีอื่น
Walf

1

ฉันพบวิธีทุบตี: cat >> IN_OUTPUT_FILE <<< "$(grep something IN_OUTPUT_FILE)"

คำสั่งใน<<<"..."จะถูกดำเนินการก่อน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.