เครื่องมือและรุ่นที่แตกต่างกันของรุ่นนั้นรองรับนิพจน์ทั่วไปที่แตกต่างกัน เอกสารของแต่ละคนจะบอกคุณว่าพวกเขาสนับสนุนอะไร
มาตรฐานมีอยู่เพื่อให้เราสามารถพึ่งพาชุดคุณลักษณะขั้นต่ำที่มีอยู่ในแอปพลิเคชันที่สอดคล้องทั้งหมด
ตัวอย่างเช่นการใช้งานที่ทันสมัยทั้งหมดของsed
และgrep
ใช้การแสดงออกปกติขั้นพื้นฐานตามที่ระบุโดย POSIX (อย่างน้อยหนึ่งรุ่นหรือมาตรฐานอื่น ๆ แต่มาตรฐานนั้นไม่ได้มีการพัฒนามากในเรื่องนั้นในช่วงไม่กี่ทศวรรษที่ผ่านมา)
ใน POSIX BRE และ ERE คุณมี[:alnum:]
คลาสอักขระ ที่ตรงกับตัวอักษรและตัวเลขในสถานที่ของคุณ (โปรดทราบว่ามักจะมีมากเกินกว่าที่a-zA-Z0-9
ยกเว้นสถานที่คือ C)
ดังนั้น:
grep -x '[[:alnum:]_]\{1,\}'
ตรงกับหนึ่งหรือมากกว่าหนึ่ง alnums หรือ _
[\w]
ถูกต้องตาม POSIX w
เพื่อให้ตรงกับทับขวาหรือ ดังนั้นคุณจะไม่พบ a grep
หรือsed
การนำไปใช้ที่มีอยู่ (ยกเว้นผ่านตัวเลือกที่ไม่ได้มาตรฐาน)
พฤติกรรมของ\w
คนเดียวไม่ได้ถูกระบุโดย POSIX ดังนั้นการใช้งานจะได้รับอนุญาตให้ทำสิ่งที่พวกเขาต้องการ GNU grep
เสริมว่านานมาแล้ว
GNU grep
เคยมีเอ็นจิ้น regexp ของตัวเอง แต่ตอนนี้มันใช้ libc ของ GNU หนึ่งตัว (แม้ว่ามันจะฝังตัวสำเนาของมันเอง)
มันหมายถึงการจับคู่ alnums และขีดล่างในสถานที่ของคุณ อย่างไรก็ตามในปัจจุบันมีข้อผิดพลาดที่ตรงกับอักขระไบต์เดียวเท่านั้น (ตัวอย่างเช่นไม่ใช่éในโลแคล UTF-8 แม้ว่าจะเป็นตัวอักษรที่ชัดเจนและถึงแม้ว่ามันจะจับคู่éในโลแคลทั้งหมดที่éนั้น ตัวอักษร)
นอกจากนี้ยังมี\w
ผู้ประกอบการ regexp ใน Perl regexp และใน PCRE PCRE / perl ไม่ใช่ POSIX นิพจน์ปกติ แต่เป็นอีกสิ่งหนึ่งโดยสิ้นเชิง
ขณะนี้มีวิธีการที่ GNU grep -P
ใช้ PCRE -P
ก็มีปัญหาเช่นเดียวกับที่โดยไม่ต้อง สามารถใช้งานได้โดยใช้(*UCP)
(แม้ว่าจะมีผลข้างเคียงในโลแคลที่ไม่ใช่ UTF8)
GNU sed
ยังใช้ regex ของ GNU libc สำหรับ regexps ของตัวเอง จะใช้มันในทางดังกล่าว แต่ที่มันไม่ได้มีข้อผิดพลาดเช่นเดียวกับ grep
GNU
GNU sed
ไม่รองรับ PCREs มีหลักฐานบางอย่างในรหัสที่เคยลองมาแล้ว แต่ดูเหมือนจะไม่อยู่ในระเบียบวาระอีกต่อไป
หากคุณต้องการนิพจน์ปกติของ Perl ให้ใช้perl
แม้ว่า
มิฉะนั้นผมจะบอกว่าแทนที่จะพยายามที่จะพึ่งพาคุณลักษณะปลอมที่ไม่ได้มาตรฐานของการดำเนินงานเฉพาะของsed
/ มันจะดีกว่าที่จะติดกับมาตรฐานและการใช้งานgrep
[_[:alnum:]]
[_[:alnum:]]
เป็นวิธีแก้ปัญหาที่ดีซึ่งทำให้ฉันสามารถขยายได้เหมือน[\w/]
([_[:alnum:]/]
ในกรณีนี้)