這個 sed-縮網址程式何時會爆炸? - Linux

Sandy avatar
By Sandy
at 2020-11-04T06:52

Table of Contents

#!/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



--
Tags: Linux

All Comments

Eartha avatar
By Eartha
at 2020-11-05T19:26
還沒看完,不過要大量用到Regex的話,sed建議加-E
Rosalind avatar
By Rosalind
at 2020-11-07T08:01
這樣很多地方就不用加反斜線了
Una avatar
By Una
at 2020-11-08T20:36
然後我會這樣寫:
sed -Ee 's@(http|https)://.*[/=]([0-9a-zA-Z_-]{11})
Donna avatar
By Donna
at 2020-11-10T09:10
.*@\1://youtu.be/\2@'
如果確定都是11碼後9碼以上,vd那段其實不用加
Eartha avatar
By Eartha
at 2020-11-11T21:45
或者也可以把{11}改成{11,}
Annie avatar
By Annie
at 2020-11-13T10:20
你要找何時會爆是要找實務上可見的,還是故意弄出會爆但實
Elma avatar
By Elma
at 2020-11-14T22:54
務上不(太可能)會出現的?
Yuri avatar
By Yuri
at 2020-11-16T11:29
shell script 部分的 portability 可以先跑 shellcheck
Mason avatar
By Mason
at 2020-11-18T00:04
看看有沒有問題,而一樓說的 sed -E 在 POSIX 沒有,所以
Blanche avatar
By Blanche
at 2020-11-19T12:38
可以猜想如果有的系統只做 POSIX 那就不能用 sed -E。
Todd Johnson avatar
By Todd Johnson
at 2020-11-21T01:13
實際測試這個 script 在 FreeBSD 執行成功但結果有誤,因
Valerie avatar
By Valerie
at 2020-11-22T13:48
為 FreeBSD 的 sed 不支援 \? 和 \n。
Dora avatar
By Dora
at 2020-11-24T02:22
B false?
Sandy avatar
By Sandy
at 2020-11-25T14:57
是說,我一直相信,B false 的情況,跟 C 一樣,
evaluation 會停下來,return false 的值...
Oliver avatar
By Oliver
at 2020-11-27T03:31
對於 Bourne shell 而言,我一直保持這種態度,
現在居然要被推翻了嗎? :(
Lydia avatar
By Lydia
at 2020-11-28T16:06
因為答案是 false 已經得到了
就不繼續 evaluate C 了
有誰在哪個系統上,哪個 shell 會繼續做 C 嗎?
Dorothy avatar
By Dorothy
at 2020-11-30T04:41
假設A true,但如果B為false,就會去執行C啊
Jacob avatar
By Jacob
at 2020-12-01T17:15
(後方命令會印出hello) $ true && false || echo hello
Anthony avatar
By Anthony
at 2020-12-03T05:50
對對對,我是錯的,頭殼壞掉了才會這樣
Irma avatar
By Irma
at 2020-12-04T18:25
沒有 xsel, uname 會得到 Darwin
Belly avatar
By Belly
at 2020-12-06T06:59
mac 要拿剪貼簿內容可以用 pbpaste
Olga avatar
By Olga
at 2020-12-07T19:34
我覺得沒必要全部寫在同一行,你可以把 sed 分成很多
Kelly avatar
By Kelly
at 2020-12-09T08:09

尤其是考慮到可讀性
Susan avatar
By Susan
at 2020-12-10T20:43
我看 freebsd 的 sed 手冊是寫支援 `\n` 的啊?
https://www.freebsd.org/cgi/man.cgi?query=sed
Madame avatar
By Madame
at 2020-12-12T09:18
手冊上指的應該是可以用 \n 配對輸入,但不能用在輸出。
Megan avatar
By Megan
at 2020-12-13T21:53
根據 POSIX 的說法,若要在 s 指令中輸出換行,則要使用
Joe avatar
By Joe
at 2020-12-15T10:27
反斜線加真正的換行字元。
Una avatar
By Una
at 2020-12-16T23:02
推文的時候我是用 N 測試的,可以 match 到。我也試過輸
Olivia avatar
By Olivia
at 2020-12-18T11:37
出換行,用 \ 加換行字元是可以輸出的。
Edwina avatar
By Edwina
at 2020-12-20T00:11
是說A &&(B||!B )||C其實就行啦
Elma avatar
By Elma
at 2020-12-21T12:46
你會以為A&&B||C可行是因為 通常BC都不會當表達式了不
會care $?是否為0
Daniel avatar
By Daniel
at 2020-12-23T01:21
因為我B常是在做 assignment,用慣了開始錯覺吧
所以不要常用成語,idiom 用多了會變 idiot! :)
George avatar
By George
at 2020-12-24T13:55
用 A && (B||true) || C會更好,避免B不是idempotent以及
省運算時間
Bethany avatar
By Bethany
at 2020-12-26T02:30
但要用 {} ,用 () 會在子 shell 裡賦值沒有用
Una avatar
By Una
at 2020-12-27T15:04
查了一下, (list) 的return value是list的值,實際用前述
John avatar
By John
at 2020-12-29T03:39
true false命令測試也確實如此
Daph Bay avatar
By Daph Bay
at 2020-12-30T16:14
true && (false||true) || echo hello 不會印hello
Ina avatar
By Ina
at 2021-01-01T04:48
true && (false||false) || echo hello 會印hello
Candice avatar
By Candice
at 2021-01-02T17:23
喔,我懂了,是指前面u大說的拿來assignment
Barb Cronin avatar
By Barb Cronin
at 2021-01-04T05:58
確實一律用 {} 比較不會搞混
Harry avatar
By Harry
at 2021-01-05T18:32
樓上大大是對的
Barb Cronin avatar
By Barb Cronin
at 2021-01-07T07:07
推 學習了

求推薦Linux gcc c語言的指令的書

Caitlin avatar
By Caitlin
at 2020-11-02T23:46
最近開始學用ubuntu的gcc寫C 可是常常遇到想要什麼功能 卻不知道有沒有直接適用的指令 雖然知道好像可以用man詢問 不過卡在一開始的關鍵字就不知道要怎麼詢問了 不知道有沒有類似的指令書可以參考的 當然有範例or中文的話最好了 - ...

apt-get 載入libraries出錯

Noah avatar
By Noah
at 2020-11-02T22:54
我是用raspberry pi 3 今天發現我的samba掛了 怎樣都無法重啟 想要重新安裝 但用apt-get安裝時,發現我的apt-get也無法使用 apt-get後面接所有指令都是一樣的狀況 piatraspberrypi:~ $ sudo apt-get update sudo: unabl ...

Top指令內的Mem in_d是什麼意思?

Candice avatar
By Candice
at 2020-11-02T16:43
如題 近期在工作上面有遇到程式執行時間越來越長的問題 目前情況是第一次執行改程式只需要5秒. 持續執行該程式會發現所需時間越來越長,直到某個限度(ex.8秒)後就會穩定在8秒這個 耗時且不會在增加(僅限該程式有這個問題) 觀察top指令每個項目的變化率,有明顯差異的就是in_d就是會一路下降到0. 所以 ...

kernel 5.9 with nvidia driver

Ingrid avatar
By Ingrid
at 2020-10-31T07:13
早上升級 arch 時已經有新版的 kernel 和 nvidia driver linux (5.9.1.arch1-1 -andgt; 5.9.2.arch1-1) nvidia (455.28-7 -andgt; 455.38-1) 目前用 mpv 開 cuda 硬解是正常的 不過不太確定其它相關 ...

Ubuntu無法開機了

Carol avatar
By Carol
at 2020-10-28T20:59
我的主機安裝中文版的Ubuntu19.10來使用。 昨天都還正常能使用啊,今天就無法開機使用了。 開機之後就出現以下訊息: http://i.imgur.com/CCkaY9L.jpg 重新開機 之後,按下F11之後就出現: http://i.imgur.com/gF0XOFN.jpg 選第一個選 ...