sed - วิธีการใช้ประโยชน์ทุก ๆ คำที่ 3?


9

ได้รับ:

main_east_library
main_west_roof
main_north_roof
minor_south_roof

ฉันจะใช้sed(โดยเฉพาะไม่ได้awk, trฯลฯ ) เพื่อสร้าง:

main_east_Library
main_west_Roof
main_north_Roof
minor_south_Roof

สิ่งที่ต้องการ:

$ echo "main_west_library
main_west_roof
main_north_roof
minor_south_roof" | sed 's_\3_upcase(\3)_' 

แม้ว่าจะให้:

sed: -e expression #1, char 16: Invalid back reference

1
โดยไม่ต้อง awk หรือ tr ของคุณจะล้มเหลวถ้าคุณลองใช้ระบบเดิมหรือระบบอื่น ๆ การแสดงออกบางอย่างในคำตอบคือส่วนขยายของ GNU!
ikrabbe

คำตอบ:


11

ด้วย GNU sed:

sed -E 's/[[:alpha:]]+/\u&/3'

จะใช้ประโยชน์จากตัวอักษรลำดับที่สามจากแต่ละบรรทัด

เพื่อประโยชน์ทุกลำดับที่สามของตัวอักษรในแต่ละบรรทัด:

sed -E 's/(([[:alpha:]]+[^[:alpha:]]+){2})([[:alpha:]]+)/\1\u\3/g'

เพื่อใช้ประโยชน์จากตัวอักษรลำดับที่สามในอินพุตทั้งหมดด้วย GNU awk:

awk -v RS='[^[:alpha:]]+' -v ORS= '
   NR % 3 == 0 {$0=toupper(substr($0,1,1)) substr($0,2)}
   {print $0 RT}'

หรือด้วยperl:

perl -Mopen=locale -pe 's/\p{alpha}+/++$n % 3 == 0 ? "\u$&" : "$&"/ge'

ในขณะที่[[:alpha:]]คลาสตัวละครสามารถสุ่มได้เล็กน้อยในบางระบบ (ตัวอย่างเช่นในระบบ GNU ที่มีตัวเลขมากมายที่มีการยกเว้นของอาราบิก (0123456789)) Perl \p{...}ก็ขึ้นอยู่กับคุณสมบัติของอักขระ Unicode ดังนั้นสิ่งเหล่านั้น\p{alpha}จะรวมถึงตัวอักษรในตัวอักษรทั้งหมดและตัวอักษรที่ไม่ใช่ตัวอักษร

มันจะไม่รวมถึงการรวมกำกับออกเสียงซึ่งหมายความว่าคำที่ต้องการStéphaneจะถือว่าเป็นคำสองคำที่แยกกัน

ดังนั้นคุณอาจต้องการ:

perl -Mopen=locale -pe 's/[\p{alpha}\p{mark}]+/++$n % 3 == 0 ? "\u$&" : "$&"/ge'

แม้ว่านั่นอาจจบลงรวมถึงจำนวนมากเกินไป

นอกจากนี้โปรดทราบว่าในทางตรงกันข้ามกับ GNU sedPerl \uจะแปลงคำอย่างถูกต้องfiddle(ซึ่งเป็นหนึ่งในอักขระมัด) เป็นFiddle(2 ตัวอักษรFและi)



2

อีก GNU sed:

sed -E 's/([^[:alpha:]])([[:alpha:]])/\1\u\2/2'

สมมติว่าบรรทัดเริ่มต้นด้วยคำเสมอ

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