ไฟล์:
O000000667520994000000074720121112000000N^@^@^@
ฉันใช้คำสั่งด้านล่าง แต่มันไม่ทำงาน
grep "^@^@^@" *
ไฟล์:
O000000667520994000000074720121112000000N^@^@^@
ฉันใช้คำสั่งด้านล่าง แต่มันไม่ทำงาน
grep "^@^@^@" *
คำตอบ:
คุณสามารถ grep สำหรับตัวละครใด ๆ รวมถึงตัวควบคุม / ตัวละครที่ไม่สามารถพิมพ์ได้ในโหมด perl-regexp (-P) ด้วยรหัสฐานสิบหก:
grep -Pa '\x00' ...
grep -Pv '\x00' file
ไม่สามารถใช้งานได้ใน Cygwin ...
-a
(บางครั้ง?) มันไม่แม้แต่จะหารูปแบบ ขอบคุณ! อาจช่วยงานอดิเรก @ ได้เช่นกัน
^@
ไม่ใช่กะรัต^
และที่เครื่องหมาย@
เป็นตัวละครหนึ่งตัว มันเป็นวิธีที่บางโปรแกรมแสดงอักขระ NUL - ค่า ASCII 0 หรือที่เรียกว่า\0
ใน C
ที่นี่ฉันได้สร้างไฟล์ที่มี NUL ไบต์อยู่ในนั้น †สังเกตว่าฉันใช้cat -v
เพื่อแสดงตัวละครที่ไม่ได้พิมพ์
$ cat -v blah
hello
null^@
hi
$ hexdump -C blah
00000000 68 65 6c 6c 6f 0a 6e 75 6c 6c 00 0a 68 69 0a |hello.null..hi.|
0000000f
Grep มีปัญหาในการค้นหา NUL เนื่องจากพวกมันคุ้นเคยกับการยกเลิกสตริงใน C. Sed แต่สามารถทำงานได้:
$ sed -n '/\x0/p' blah
null
$ sed -n '/\x0/p' blah | cat -v
null^@
†ใน vi ในโหมดแทรกกดCtrl- V, Ctrl- Shift- @เพื่อแทรกไบต์ว่าง
ในทุบตีคุณสามารถเพิ่มตัวอักษรพิเศษเมื่อนำหน้าด้วยหรือC-q
C-v
ตัวอย่างเช่นคุณสามารถ
grep 'Ctrl-vCtrl-a' file.txt
สตริงการค้นหาควรอ่านเป็นcontrol key
+ character v
ตามด้วยcontrol key
+ character a
ซึ่งค้นหาค่า ASCII SOH (01) น่าเสียดายที่นี่ใช้ไม่ได้กับตัวละคร NUL
^ @ เป็นอักขระ NUL คุณต้องการทำอะไรกับไฟล์ที่บรรจุอยู่?
คุณสามารถดูได้ที่ /programming/2398393/identifying-and-removing-null-characters-in-unixซึ่งเกี่ยวข้องกับปัญหาที่คล้ายกัน
ตัวละคร ^ @ เป็นตัวละครของ NUL ดังนั้นฉันกลัวว่ามันจะไม่สามารถโลภได้โดยตรง
ตัวเลือกที่ดีที่สุดของคุณน่าจะเขียนโปรแกรมง่าย ๆ ที่ค้นหาลำดับของไบต์
หรือคุณอาจพยายามที่จะแปลงเป็นรูปแบบของการถ่ายโอนข้อมูลเลขฐานสิบหก (บางod
, xxd
หรือดังนั้น) และ grep เข้าออกของมัน แต่การพูดอย่างตรงไปตรงมามันจะยากที่จะทำให้ถูกต้อง
-a
ตัวเลือกมิฉะนั้นgrep
คิดว่าเป็นข้อมูลไบนารีและจะไม่แสดงบรรทัดที่ตรงกัน