จะระบุตัวอักษรโดยใช้รหัสเลขฐานสิบหกใน `grep 'ได้อย่างไร


27

ฉันใช้คำสั่งต่อไปนี้เพื่อตั้งค่าช่วงอักขระ grep สำหรับรหัสเลขฐานสิบหก 0900 (แทนअ) ถึง 097F (แทนव) ฉันจะใช้รหัสเลขฐานสิบหกแทนअและवได้อย่างไร

bzcat archive.bz2 | grep -v '<[अ-व]*\s' | tr '[:punct:][:blank:][:digit:]' '\n' | uniq | grep -o '^[अ-व]*$' | sort -f | uniq -c | sort -nr | head -50000 | awk '{print "<w f=\""$1"\">"$2"</w>"}' > hindi.xml

ฉันได้รับผลลัพธ์ต่อไปนี้:

    <w f="399651">और</w>
    <w f="264423">एक</w>
    <w f="213707">पर</w>
    <w f="74728">कर</w>
    <w f="44281">तक</w>
    <w f="35125">कई</w>
    <w f="26628">द</w>
    <w f="23981">इन</w>
    <w f="22861">जब</w> 
    ...

ฉันแค่ต้องการใช้รหัสเลขฐานสิบหกแทนअและवในคำสั่งด้านบน

หากไม่สามารถใช้รหัสเลขฐานสิบหกได้ฉันสามารถใช้ unicode แทนรหัสเลขฐานสิบหกสำหรับชุดอักขระ ('अ-व') ได้หรือไม่

ฉันใช้ Ubuntu 10.04


1
คุณหมายถึง "ไม่ทำงาน"? นอกจากนี้ยัง-vตีความการแข่งขันจากข้อความคำถามของคุณมันก็ดูเหมือนว่าไม่ใช่สิ่งที่คุณต้องการ
Christian.K

@ Christian.K ขออภัยในความล่าช้า ... ฉันได้แก้ไขคำถามโปรดดู

ฉันยังคงรอคำตอบที่เหมาะสม :(
Dhrubo Bhattacharjee

คำตอบ:


21

ดูคำถามนี้

ข้อความมักถูกเข้ารหัสใน UTF-8 ดังนั้นคุณต้องใช้ค่าฐานสิบหกของไบต์ที่ใช้ในการเข้ารหัส utf-8

grep "["$'\xe0\xa4\x85'"-"$'\xe0\xa4\xb5'"]"

และ

grep '[अ-व]'

จะเทียบเท่าและพวกเขาทำการจับคู่ตามโลแคล (นั่นคือการจับคู่จะขึ้นอยู่กับกฎการเรียงลำดับของสคริปต์เทวนาครี (นั่นคือการจับคู่ไม่ใช่ "อักขระใด ๆ ระหว่าง \ u0905 และ \ 0935" แต่แทนที่จะเป็น "การเรียงลำดับใด ๆ ระหว่างเทวนาครี A และ devanagari VA "อาจมีความแตกต่าง

ในทางกลับกันคุณมีสิ่งนี้ (โน้ต -P):

grep -P "\xe0\xa4[\x85-\xb5]"

ที่จะทำการจับคู่แบบไบนารีกับค่าไบต์เหล่านั้น


2
โปรดอธิบายคำนำหน้า"["$'และคำต่อท้าย"]"
Jonathan Komar

6

หากการหลบหนีของเชลล์นั้นเพียงพอคุณสามารถใช้$'\xHH'ไวยากรณ์ดังนี้:

grep -v "<["$'\x09\x00'"-"$'\x09\x7F'"]*\s"

เพียงพอสำหรับกรณีการใช้งานของคุณหรือไม่


echo 'अ-व' | hdให้ฉันe0 a4 85 - e0 a4 b5
enzotib

แน่นอน OP ให้ค่ายูนิโค้ดไม่ทิ้งเลขฐานสิบหกในการเข้ารหัส UTF-8: - / เนื่องจากgrepไม่มีการเชื่อมโยงกับ lib ใด ๆ ฉันเดาว่ามันเป็นไปไม่ได้ที่จะทำการแปลงช่วงโดย grep: - /
Stéphane Gimenez

1
Btw zshสามารถตีความ"\u0900"และ"\u097F"ได้ แต่พฤติกรรมจะขึ้นอยู่กับช่วงที่เข้ารหัส UTF-8 อย่างต่อเนื่อง (อาจเป็น)
Stéphane Gimenez

ไม่มี grep -v "<[" $ '\ x09 \ x00' "-" $ '\ x09 \ x7F' "] * \ s" ให้เอาต์พุตต่อไปนี้ <wf = "16929"> x </w> <wf = " 10995 "> F </w> <wf =" 2548 "> FF </w> <wf =" 762 "> FFFFFF </w> <wf =" 655 "> FFFF </w> <wf =" 266 " > xx </w> <wf = "215"> FFF </w> <wf = "117"> xxx </w> .... ไม่ได้คาดหวัง :(, ฉันสามารถใช้ unicode แทนรหัสเลขฐานสิบหกหรือชุดอักขระ ('अ-व') ได้ไหม
Dhrubo Bhattacharjee

6

ค่า "เลขฐานสิบหก" ที่0x0900คุณเขียนนั้นมีค่าตรงกับจุดโค้ด UNICODE ซึ่งเป็นเลขฐานสิบหกเช่นกัน

รหัสเลขฐานสิบหก 0900 (แทนअ)

ผมเชื่อว่าสิ่งที่คุณหมายถึงว่าเป็นจุดฐานสิบหกรหัส UNICODE U0905นี้:

ตัวละครที่ U-0900 ไม่ได้เป็นหนึ่งที่คุณใช้:
อักขระนั้นคือ U0905ส่วนหนึ่งของหน้า Unicode นี้หรืออยู่ในหน้านี้

ในbash(ติดตั้งโดยค่าเริ่มต้นใน Ubuntu) หรือโดยตรงกับโปรแกรมที่: /usr/bin/printf(แต่ไม่ใช่กับshprintf) อักขระ Unicode สามารถสร้างได้ด้วย:

$ printf '\u0905'

$ /usr/bin/printf '\u0905'

อย่างไรก็ตามอักขระนั้นซึ่งมาจากหมายเลขจุดรหัสอาจถูกแทนด้วยสตรีมไบต์จำนวนมากโดยขึ้นอยู่กับว่าใช้โค้ดเพจใด
ควรชัดเจนว่า\U0905อยู่0x09 0x05ใน UTF-16 (UCS-2 ฯลฯ )
และ0x00 0x00 0x09 0x05ใน UTF-32
มันอาจจะไม่ชัดเจน แต่ใน utf-8 มันถูกแทนด้วย0xe0 0xa4 0x85:

$ /usr/bin/printf '\u0905' | od -vAn -tx1
e0 a4 85

en_US.UTF-8หากสถานที่เกิดเหตุของคอนโซลของคุณคือสิ่งที่คล้ายกับ

และฉันกำลังพูดถึงเชลล์เพราะมันเป็นสิ่งที่แปลงสตริงเป็นสิ่งที่แอปพลิเคชันได้รับ นี้:

grep "$(printf '\u0905')" file

ทำให้ grep "เห็น" ตัวละครที่คุณต้องการ
เพื่อทำความเข้าใจกับบรรทัดข้างต้นคุณอาจใช้ echo:

$ echo grep "$(printf '\u0905')" file
grep  file

จากนั้นเราสามารถสร้างช่วงอักขระตามที่คุณร้องขอ:

$ echo grep "$(printf '[\u0905-\u097f]')" file
grep [अ-ॿ] file

ที่ตอบคำถามของคุณ:

ฉันจะใช้รหัสเลขฐานสิบหกแทนअและवได้อย่างไร


นี่คือคำตอบที่ดีที่สุด - มันชัดเจนถึงปัญหาของการเป็นตัวแทนจุด Unicode ในเปลือกและแสดงวิธีการไปมาระหว่างรหัสฐานสิบหก
ฟาโน

2

เราต้องการแปลงเครื่องหมายคำพูดคู่ที่ไม่ใช่แบบเปิด ASCII และเครื่องหมายอัญประกาศคู่ปิดเป็นเครื่องหมายคำพูดคู่ปกติ (") นอกจากนี้ยังมีเครื่องหมายคำพูดเดี่ยวที่ไม่ใช่ ASCII เป็นเครื่องหมายคำพูดเดี่ยวทั่วไป (')

เพื่อดูพวกเขาในไฟล์ (ubuntu bash shell):

$ grep -P "\x92" infile.txt  (single)
$ grep -P "\x93" infile.txt  (open double)
$ grep -P "\x94" infile.txt  (close double)

แปลพวกเขา:

$ /bin/sed "s/\x92/'/g" a.txt > b.txt
$ /bin/sed 's/\x93/"/g' b.txt > c.txt
$ /bin/sed 's/\x94/"/g' c.txt > d.txt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.