การลบอักขระจากสตริงผ่านเทอร์มินัล


5

เป้าหมายหลักของฉันคือการสามารถใช้ Terminal เพื่อเปิด

http://t.umblr.com/redirect?z=https%3A%2F%2Farchiveofourown.org%2Fworks%2F1885509&t=N2M3YmNhNjQzODU5MjI2NmE5ZjljY2Y4NWVhOTVhM2IwYzgyYzYyYixLOHhQakVRbA%3D%3D

เข้าไป

https://archiveofourown.org/works/1885509

ฉันคิดว่าสถานที่ที่ดีในการเริ่มต้นจะอยู่ที่การหาวิธีลบ http://t.umblr.com/redirect?z=.

ฉันเหนื่อย tr -d; อย่างไรก็ตามดูเหมือนว่าจะไม่มีวิธีการลบเฉพาะอินสแตนซ์แรกของกลุ่มอักขระ

ดังต่อไปนี้ (โดยใช้ cut ) จะทำงานอย่างต่อเนื่องหากความยาวของ เชือก ไม่เคยเปลี่ยนแปลงซึ่งหมายความว่าไม่มีการรับประกันสำหรับการใช้งานในอนาคต

 echo 'http://t.umblr.com/redirect?z=https%3A%2F%2Farchiveofourown.org%2Fworks%2F1885509&t=N2M3YmNhNjQzODU5MjI2NmE5ZjljY2Y4NWVhOTVhM2IwYzgyYzYyYixLOHhQakVRbA%3D%3D' | cut -c31-83

สิ่งนี้ดูมีแนวโน้ม:

 var="http://t.umblr.com/redirect?z=https%3A%2F%2Farchiveofourown.org%2Fworks%2F1885509&t=N2M3YmNhNjQzODU5MjI2NmE5ZjljY2Y4NWVhOTVhM2IwYzgyYzYyYixLOHhQakVRbA%3D%3D" | var=${var:30} 

แต่เพราะฉันไม่สามารถรับ | pbcopy ในการทำงานฉันไม่สามารถออกไปด้านนอกเพื่อพิมพ์ฉันมีความคิดว่ามันทำอะไรจริงๆ

ฉันไม่รู้ว่ามีเชลล์สคริปต์หรือไม่ที่จะให้ฉันเก็บสิ่งที่ปรากฏระหว่างเครื่องหมายเท่ากับ จากบทเรียนและคำถามที่ฉันได้พบ sed ดูเหมือนว่ามันจะเป็นตัวเลือกที่ดีที่สุดของฉัน (ถ้าฉันสามารถหาได้) แต่ดูเหมือนว่าจะใช้งานได้กับไฟล์ไม่ใช่สตริง

ที่ไหนดีกว่าที่ฉันจะเริ่ม

คำตอบ:


5

ดูเหมือนว่าจะใช้งานได้:

$ echo 'http://t.umblr.com/redirect?z=https%3A%2F%2Farchiveofourown.org%2Fworks%2F1885509&t=N2M3YmNhNjQzODU5MjI2NmE5ZjljY2Y4NWVhOTVhM2IwYzgyYzYyYixLOHhQakVRbA%3D%3D' | awk 'BEGIN{FS="=|&"}{gsub(/%3A/, ":")}{gsub(/%2F/, "/")}{print $2}'
https://archiveofourown.org/works/1885509
$

สิ่งที่เกิดขึ้นที่นี่คือ URL เชือก ถูกวางในเครื่องหมายคำพูดเดี่ยวและการใช้ echo ถูกส่งไปแล้ว | เป็น awk โครงการ .

ไวยากรณ์ตัวอย่าง:

echo 'URL' | awk 'BEGIN{FS="=|&"}{gsub(/%3A/, ":")}{gsub(/%2F/, "/")}{print $2}'

หนึ่งในเหตุผลที่ฉันตัดสินใจที่จะเริ่มต้นด้วยการลบตัวละครที่จุดเริ่มต้นคือการแทนที่ %3A เข้าไป : และ %2F เข้าไป / ถูกพิสูจน์มากเกินไป - ขอบคุณ ฉันได้ลองแล้วด้วยลิงค์ต่าง ๆ จำนวนมากและใช้งานได้ ฉันจำไม่ได้ awk ปรากฏขึ้นในการวิจัยของฉันฉันจะใช้เวลาในหน้าของมัน ฉันสงสัยเกี่ยวกับ BEGIN{FS="=|&"}. คือว่า start after the first '=' and go until the next '=', but no really, stop at the '&'?
345422

@ รุ่นธรรมดาฉันหวังว่าฉันจะรู้ awk ดีพอที่ฉันสามารถอธิบายวิธีการ ตัวคั่นฟิลด์ ทำงานเมื่อใช้งานในแบบที่ฉันทำ ฉันต้องยอมรับว่ามันสามารถเขียนเป็น {FS="[=&]"} และมันก็น่าจะใช้ได้ในกรณีนี้เช่นกัน ฉันเขียนตอนแรก awk โครงการ การใช้ {FS="="} และเมื่อฉันเห็น &t ในตอนท้ายของผลลัพธ์ที่ฉันแก้ไข ตัวคั่นฟิลด์ หวังว่ามันจะลบออกและมันก็ทำ เพราะฉันไม่สามารถอธิบายได้ส่วนนั้นเป็นสาเหตุที่ฉันพูดว่า "นี่ดูเหมือนจะใช้ได้:" แม้ว่าจะถือว่ามี URL อื่นที่จะดำเนินการตามรูปแบบเดียวกันซึ่งเป็นรูปแบบทั่วไป
user3439894

@boredrandom, BTW ไม่แน่ใจว่าคุณต้องการใช้มันอย่างไรในท้ายที่สุด แต่ฉันคิดว่าฉันพูดถึงเพราะ awk โครงการ กำลังส่งคืน เอาท์พุต ก่อนที่ รวดเร็ว ผลตอบแทนที่คุณสามารถเปลี่ยนเส้นทาง เอาท์พุต , เช่น. เพิ่ม `| pbcopy` ในตอนท้ายจะวางไว้บน คลิปบอร์ด ก่อนที่ รวดเร็ว ผลตอบแทนและคุณจะไม่เห็น เอาท์พุต จนกว่าคุณจะวางมันไว้ที่อื่น มีวิธีอื่นในการผสมผสาน รหัส ขึ้นอยู่กับว่าคุณต้องการใช้มันอย่างไรถ้าคุณต้องการความช่วยเหลือ
user3439894

ขอบคุณ จริงๆแล้วสิ่งแรกที่ฉันทำคือเพิ่ม pbcopy. ฉันต้องการสร้างบริการอัตโนมัติสำหรับ คัดลอกลิงค์ ใช้สคริปต์นี้และเพิ่ม URL ใหม่ให้กับคลิปบอร์ดของฉัน (เนื่องจาก Tumblr เริ่มใช้การเปลี่ยนเส้นทางแล้ว) ฉันต้องการให้ส่วนนี้เสร็จก่อน
345422

2

ใช้ Perl สร้างไฟล์ข้อความนี้และตั้งชื่อบางอย่างเช่น "redo.pl":

my $url = $ARGV[0];
$url =~ s/%3A/:/g;
$url =~ s/%2F/\//g;
$url =~ /=\K(.*)(?=&)/;
print $1;

มันสามารถเรียกใช้จาก terminal เป็น:

 perl redo.pl http://t.umblr.com...

ผลลัพธ์จะเป็น:

https://archiveofourown.org/works/1885509

ฉันเพิ่งดาวน์โหลด perl ผ่านทาง Homebrew แต่ฉันไม่แน่ใจว่าจะติดตั้งและใช้งานได้อย่างไร คุณรู้จักสมาคมที่มีประโยชน์หรือไม่? (หรือฉันควรตั้งคำถามนี้อีก)
345422

1
ปัญหาหลักที่คุณต้องให้ความสำคัญคือ Homebrew จะติดตั้ง Perl แต่จะไม่ทำให้รุ่นเป็นค่าเริ่มต้นเนื่องจาก Mac OS มาพร้อมกับ Perl (System Perl) ของตัวเองและ Homebrew ไม่ต้องการปิดการใช้งาน แหล่งข้อมูลที่ดีที่สุดที่ฉันรู้เพื่อเรียนรู้วิธีการใช้ Perl ของคุณเองในขณะที่ออกจากระบบ Perl ที่ใช้งานอยู่คือการดูโปรแกรมช่วยเหลือที่เรียกว่า Perlbrew หน้าแรกของมันคือ perlbrew.pl . ฉันขอแนะนำเว็บไซต์ LearnPerl ที่ learn.perl.org และหนังสือที่เกี่ยวข้อง "การเรียนรู้ Perl" โดย Randal L. Schwartz, brian d foy, Tom Phoenix ไม่มีวิธีที่ดีกว่าหรือง่ายกว่าในการเรียนรู้ Perl
Pinecone

1

หากคุณต้องการใช้ sed:

echo 'URL' | cut -d = -f 2 | sed -e 's|\%3A|:|g' -e 's|\%2F|/|g'

หรือแม้กระทั่งโดยไม่ต้อง cut และเพียงหนึ่งสายที่จะ sed

echo 'URL' | sed -e 's|.*z=\(.*\)\&.*|\1|' -e 's|\%3A|:|g' -e 's|\%2F|/|g'

หนึ่งในเหตุผลที่ฉันตัดสินใจที่จะเริ่มต้นด้วยการลบตัวละครที่จุดเริ่มต้นคือการแทนที่ %3A เข้าไป : และ %2F เข้าไป / ถูกพิสูจน์มากเกินไป - ขอบคุณ เพิ่งออกมาจากความอยากรู้ส่วนหนึ่งของสิ่งนี้จะลบ t.umblr.com บิต? มันคือ -f 2 ส่วนหนึ่ง?
345422

@boredrandom -d = ตั้งค่าตัวคั่น -f 2 เลือกฟิลด์ที่สอง
nohillside

และในความคิดที่สองทางออกของฉันไม่ได้ลบส่วนหลังจาก & ยัง สามารถทำได้ด้วย cut หรือ sedแต่ให้ฉันกลับหน้าคอมพิวเตอร์ที่ใช้ bash ก่อน :-)
nohillside

หนึ่งในเหตุผลที่ฉันเริ่มใช้ awk บ่อยขึ้นฉันพบว่าตัวเองเขียนบ่อยเกินไป รหัส ที่อาศัยการไพพ์ผ่านคำสั่งหลายคำสั่งที่สามารถแทนที่ด้วยคำสั่งเดียวได้อย่างง่ายดาย awk โครงการ . สำหรับฉันนี่ดูเหมือนจะเป็นวิธีที่ดีกว่าในการทำสิ่งต่าง ๆ และจากสิ่งที่ฉันอ่านมีประสิทธิภาพมากขึ้นแล้วใช้หลายท่อ ทั้งสองวิธีมีวิธีใช้ทั้งสองวิธี
user3439894

1

นี่คือตัวอย่างการใช้ php และมัน urldecode() ฟังก์ชัน

echo 'URL' | php -r '$str = urldecode(fgets(STDIN));
$str = explode("=", $str);
$str = explode("&", $str[1]);
printf("%s\n", $str[0]);'
  • ฟังก์ชั่น urldecode() ถอดรหัสการเข้ารหัส% ## ใด ๆ
  • ฟังก์ชั่น explode() เปลี่ยน var str เป็นการแบ่งอาร์เรย์บนเครื่องหมายเท่ากับ
  • ที่สอง explode() ฟังก์ชั่นเปลี่ยนค่าของอาเรย์ str [1] เป็นอาเรย์แยกบน & amp; ลงชื่อแทนที่อาร์เรย์อาเรย์
  • จากนั้นพิมพ์ค่าแรกของ str อาร์เรย์ใหม่

โซลูชันอื่นที่ใช้ไวยากรณ์เปลือกบริสุทธิ์ (ไม่มีโปรแกรมภายนอก): ksh, zsh, bash- OSX 10.6 และรุ่นที่สูงกว่า

url='http://t.umblr.com/redirect?z=https%3A%2F%2Farchiveofourown.org%2Fworks%2F1885509&t=N2M3YmNhNjQzODU5MjI2NmE5ZjljY2Y4NWVhOTVhM2IwYzgyYzYyYixLOHhQakVRbA%3D%3D'
nurl=${url//\%2F//}; nurl=${nurl//\%3A/:}
nurl=${nurl%=*}; nurl=${nurl#*=}
echo ${nurl%\&*}

สวัสดี และขอขอบคุณสำหรับการเพิ่มของคุณ คุณพูดว่า "ไวยากรณ์เปลือกบริสุทธิ์ (ไม่มีโปรแกรมภายนอก)" คุณหมายถึงโปรแกรมเช่นนั้นหรือไม่ .Replace ?
345422

ชอบ sed, awk, php.... ฯลฯ นอกจากเปลือก
fd0

โอ้ ถูก ฉันไม่รู้ว่าเป็นโปรแกรมภายนอก มีบางอย่างใน man ที่ชี้ให้เห็นว่าคำสั่งสำหรับภายในหรือภายนอก? (ดังนั้นฉันจึงมีความคิดว่าจะมองหาอะไร)
345422

แต่ละเชลล์มีภาษาโปรแกรมของตัวเอง ภาษาเหล่านี้อนุญาตให้คุณจัดการสตริงโดยไม่จำเป็นต้องเรียกโปรแกรมอื่น ๆ (โปรแกรมภายนอก) เช่น awk หรือ sed ... ในตัวอย่างเราใช้ Parameter Expansion เพื่อจัดการสตริงที่มีอยู่ในตัวแปร url สมมติว่าเชลล์ของคุณทุบตีใช้คำสั่งต่อไปนี้และอ่านไปที่ man page- man -P "less -p 'Parameter Expansion'" bash
fd0
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.