Linux 板


LINE

其實不一定要全部擠在同一行。 看你好像對 sed 還有愛,可以看看 sed 的語法。 我會把不同的 pattern 寫成不同行,會比較好讀, 也不用想要怎麼把一堆 pattern 擠在同一個 regexp 裡。 反正只會有一行能成功匹配執行,其它會因為不匹配就放掉了。 另外你的 (idempotent) ,是保留 protocol 而已嗎? 還是希望連 querystring 其它參數也保留? 要的話可能要多寫幾個 pattern 去抓。 ```sh youtu() { local vid vid='\([0-9a-zA-Z_-]\{11\}\)' sed " # hold protocol to hold space h s|^\(https*://\).*|\1| s|\$|youtu.be/| x # only one of them should match s|.*/v/$vid\$|\1| s|.*/v/$vid?.*|\1| s|.*/watch?v=$vid.*|\1| s|.*/watch?.*&v=$vid.*|\1| s|.*/user/.*/[0-9]*/$vid\$|\1| s|.*/user/.*/[0-9]*/$vid?.*|\1| s|.*embed/$vid\$|\1| s|.*embed/$vid?.*\$|\1| # append replace result to hold space # then move all to pattern space H g # there should be a \n after Hold, so remove it s/\n// " } ``` 後面有個比較奇怪的寫法是我用 s 把換行刪掉, 因為 H 把 pattern space 加到 hold space 結尾時, 似乎會加上一個換行符,那就只好事後再刪掉。 ※ 引述《cuello (cuello)》之銘言: : #!/bin/sh : # : # 1604436674 created for testing in Linux/PTT : # : # 這是個 YouTube 縮網址的 one-liner. 必須很 portable. : # 我已測試過各種不同形狀的水管 url's 例如: : # : # /v/<VID> : # watch?v=<VID> : # embed/<VID>?rel=0 : # watch?argv=xyz&v=<VID> : # watch?v=<VID>&list=PLDB852818BF378DAC : # watch?v=<VID>&feature=related : # watch?argv=xyz&v=<VID> : # watch?v=<VID>&feature=feedrec_grec_index : # user/IngridMichaelsonVEVO#p/a/u/1/<VID> : # v/<VID>?fs=1&amp;hl=en_US&amp;rel=0 : # watch?v=<VID>#t=0m10s : # embed/<VID>?rel=0 : # watch?v=<VID> : # http://youtu.be/<VID> (idempotent) : # : # 能不能幫忙看看還有哪些 url's 會出錯, 並幫忙想辦法? : # : # 我本來不喜歡縮網址的, 因為不知道有效期限多久... : # 但如果我沒誤解的話, youtu.be 是水管自家的, : # 而且保留了原始的影片 ID (確定都是11個字嗎?). : # 所以還可以接受. : # : # 解說: : # : # 0. 它必須儘可能 portable, 不管甚麼系統, 必須隨抄即用 : # 誰有 Solaris, SunOS, OsX, Ultrix, AIX, ... 拜託! : # 我只是很好奇, 它能有多廣的 portability. : # : # 1. 請忽視與 termux 有關的東西, 那是讓手機也可以用的, : # : # 2. youtu() 就已經是個充份的 one-liner. : # 為了應付可能出現的雜七雜八的選項及形態 : # 我決定擷取 \1. protocol 跟 \2. video_id : # 然後忽略掉其它可能出現的所有東西. : # : # 3. 為方便測試, 所以它要可以從 X-clipborad 讀取, : # 由 stdin 讀取, 也可以由指令行讀取. : # : # 4. 用了 sed(1) tr(1) grep(1) xsel(1) termux-clipboard-get(1) : # : # 5. 1604555294 新增, 原本的 -e 's/$/\n/' | tr -s '\n' 是為了確保 : # 行尾起碼有一個 newline, 而且只有一個. 這也是為了使用上方便. : youtu() : { : # sed -e 's|^\(http.\?\):.*[/vd]\{0,1\}[0-9vd][/=]\([0-9a-zA-Z_-]\{11\}\).*$|\1://youtu.be/\2|' -e 's/$/\n/' | tr -s '\n' : # 哇-- 這行那麼長不知道會不會壞掉.... : # : # 1604555294 更新, 上面那一行到 FreeBSD 就燒了, 先斷成兩行吧 (lantw44) : # sed 's|^\(http[s]\{0,1\}\):.*[/vd]\{0,1\}[0-9vd][/=]\([0-9a-zA-Z_-]\{11\}\).*$|\1://youtu.be/\2\ : #|' | tr -s '\n' : # 1604671459 找了 awk 幫忙來確保 one & only one newline : sed 's|^\(http[s]\{0,1\}\):.*[/vd]\{0,1\}[0-9vd][/=]\([0-9a-zA-Z_-]\{11\}\).*$|\1://youtu.be/\2|' | awk 1 : } : if [ -t 0 ] # priority: stdin > "$1" > X-clipboard : then : # echo "$HOME" | grep -q termux && XGET="termux-clipboard-get" || XGET="xsel" : # [ "$1" ] && echo "$1" | youtu || $XGET | youtu : # 1604570722 還是改一下吧, 以上兩行是錯的, A && B || C 不是 if-then-else : # (contributors: lantw44 rickieyang bitlife) : # if echo "$HOME" | grep -q termux : # then : # XGET="termux-clipboard-get" : # else : # XGET="xsel" : # fi : # : # if [ "$1" ] : # then : # echo "$1" | youtu : # else : # $XGET | youtu : # fi : # 1604671459 讓它在 Mac 上也會動 (rickieyang) : if [ "$1" ] : then : echo "$1" | youtu : else # termux > Mac > X11 : XGET="xsel" : uname | grep -q "Darwin" && XGET="pbpaste" : echo "$HOME" | grep -q "termux" && XGET="termux-clipboard-get" : $XGET | youtu : fi : else : youtu : fi -- 我喜歡怕冷的女生 因為在冬天我可以一直抱著她 我喜歡貪吃的女生 因為我可以餵她吃東西 我喜歡愛睡的女生 因為看著她的睡臉我感到幸福 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.137.95.81 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Linux/M.1604673680.A.7C7.html
1F:推 holishing: 在 FreeBSD 裝 gsed (X 11/06 22:54
※ 編輯: Gold740716 (220.137.95.81 臺灣), 11/07/2020 14:42:49
2F:推 cuello: 展開來真的比較容易維護, 我來放一起好嗎? 11/07 17:20
3F:→ Gold740716: 好 11/07 19:45







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP